概念:
該模式定義了一系列算法,并將每個(gè)算法封裝起來(lái),使它們可以相互替換,且算法的變化不會(huì)影響使用算法的客戶。其思想是針對(duì)一組算法,將每一種算法都封裝到具有共同接口的獨(dú)立的類中,從而是它們可以相互替換。策略模式的最大特點(diǎn)是使得算法可以在不影響客戶端的情況下發(fā)生變化,從而改變不同的功能。
舉例:
我們就以Java中的TreeSet為例,TreeSet僅僅知道它只是接收一個(gè)Comparator這種接口類型,但是具體是哪種實(shí)現(xiàn)類,TreeSet并不關(guān)心,實(shí)現(xiàn)類在真正的傳入TreeSet之前,TreeSet本身是不知道的,所以我們可以自己去實(shí)現(xiàn)Comparator接口,然后在實(shí)現(xiàn)類里面去封裝好我們自己的規(guī)則(這里的規(guī)則你可以當(dāng)做是算法),比如說(shuō)我們要實(shí)現(xiàn)對(duì)一個(gè)集合的元素排序,但是到底是要升序排序還是降序排序,這個(gè)完全由我們來(lái)去控制,我們可以把這種變化的內(nèi)容封裝到自己的實(shí)現(xiàn)類中,真正運(yùn)行的時(shí)候才知道具體的實(shí)現(xiàn)。

TreeSet
組成:
- Strategy 抽象策略角色這個(gè)是一個(gè)抽象的角色,通常情況下使用接口或者抽象類去實(shí)現(xiàn)。對(duì)比來(lái)說(shuō),就是我們的Comparator接口。
- Concrete Strategy 具體策略角色包裝了具體的算法和行為。對(duì)比來(lái)說(shuō),就是實(shí)現(xiàn)了Comparator接口的實(shí)現(xiàn)一組實(shí)現(xiàn)類。
- Context 環(huán)境角色內(nèi)部會(huì)持有一個(gè)抽象角色的引用,給客戶端調(diào)用。對(duì)比來(lái)說(shuō),就是我們的TreeSet類。說(shuō)明:TreeSet內(nèi)部一定會(huì)有一個(gè)策略類的一個(gè)成員變量,這樣做的目的在于可以當(dāng)我們?cè)谌?chuàng)建TreeSet對(duì)象的時(shí)候,可以接收我們向TreeSet類中傳遞的具體的策略類。
編寫步驟:
- 定義抽象策略角色(為策略對(duì)象定義一個(gè)公共的接口)
- 編寫具體策略角色(實(shí)際上就是實(shí)現(xiàn)上面定義的公共接口)
- 定義環(huán)境角色,內(nèi)部持有一個(gè)策略類的引用
結(jié)構(gòu)圖:

celue.gif
實(shí)現(xiàn)代碼:
public class StrategyPattern
{
public static void main(String[] args)
{
Context c=new Context();
Strategy s=new ConcreteStrategyA();
c.setStrategy(s);
c.strategyMethod();
System.out.println("-----------------");
s=new ConcreteStrategyB();
c.setStrategy(s);
c.strategyMethod();
}
}
//抽象策略類
interface Strategy
{
public void strategyMethod(); //策略方法
}
//具體策略類A
class ConcreteStrategyA implements Strategy
{
public void strategyMethod()
{
System.out.println("具體策略A的策略方法被訪問(wèn)!");
}
}
//具體策略類B
class ConcreteStrategyB implements Strategy
{
public void strategyMethod()
{
System.out.println("具體策略B的策略方法被訪問(wèn)!");
}
}
//環(huán)境類
class Context
{
private Strategy strategy;
public Strategy getStrategy()
{
return strategy;
}
public void setStrategy(Strategy strategy)
{
this.strategy=strategy;
}
public void strategyMethod()
{
strategy.strategyMethod();
}
}
例子:
-
定義抽象策略角色
1.jpg -
定義具體策略角色(本例子僅僅演示,只是定義加、減兩種具體策略)
加法策略:
2.jpg
減法策略:

3.jpg
-
環(huán)境角色
4.jpg -
測(cè)試類
5.jpg



