策略模式的用意是針對一組算法,將每一個(gè)算法封裝到具有共同接口的獨(dú)立的類中,從而使得它們可以相互替換。策略模式使得算法可以在不影響到客戶端的情況下發(fā)生變化。策略模式相當(dāng)于"可插入式(Pluggable)的算法。

Strategy模式以下列幾條原則為基礎(chǔ):
1) 每個(gè)對象都是一個(gè)具有職責(zé)的個(gè)體。
2) 這些職責(zé)不同的具體實(shí)現(xiàn)是通過多態(tài)的使用來完成的。
3) 概念上相同的算法具有多個(gè)不同的實(shí)現(xiàn),需要進(jìn)行管理
通過以下步驟,開發(fā)人員可以很容易地在軟件中實(shí)現(xiàn)策略模型:
1)對策略對象定義一個(gè)公共接口。
2)編寫策略類,該類實(shí)現(xiàn)了上面的公共接口。
3)策略對象的類中保存一個(gè)對策略對象的引用。
4)略對象的類中,實(shí)現(xiàn)對策略對象的set和get方法。
一,結(jié)構(gòu):

環(huán)境(Context)角色:持有一個(gè)Strategy類的引用。
抽象策略(Strategy)角色:這是一個(gè)抽象角色,通常由一個(gè)接口或抽象類實(shí)現(xiàn)。此角色給出所有的具體策略類所需的接口。
具體策略(ConcreteStrategy)角色:包裝了相關(guān)的算法或行為。
二、代碼
/**
* 抽象策略(Strategy)角色
* @author Salmon
*
*/
public interface Strategy {
public void algorithmInterface();
}
/**
* 具體策略(ConcreteStrategy)角色
* @author Salmon
*
*/
public class ConcreteStrategyA implements Strategy {
public void algorithmInterface() {
System.out.println("Called ConcreteStrategyA.algorithmInterface()");
}
}
/**
* 具體策略(ConcreteStrategy)角色
* @author Salmon
*
*/
public class ConcreteStrategyB implements Strategy {
public void algorithmInterface() {
System.out.println("Called ConcreteStrategyB.algorithmInterface()");
}
}
/**
* 具體策略(ConcreteStrategy)角色
* @author Salmon
*
*/
public class ConcreteStrategyC implements Strategy {
public void algorithmInterface() {
System.out.println("Called ConcreteStrategyC.algorithmInterface()");
}
}
/**
* 環(huán)境(Context)角色
* @author Salmon
*
*/
public class Context {
Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public void contextInterface() {
strategy.algorithmInterface();
}
}
/**
* 客戶端代碼
* @author Salmon
*
*/
public class Client {
public static void Main(String[] args) {
Context c = new Context(new ConcreteStrategyA());
c.contextInterface();
Context d = new Context(new ConcreteStrategyB());
d.contextInterface();
Context e = new Context(new ConcreteStrategyC());
e.contextInterface();
}
}