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

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

環境(Context)角色:持有一個Strategy類的引用。
抽象策略(Strategy)角色:這是一個抽象角色,通常由一個接口或抽象類實現。此角色給出所有的具體策略類所需的接口。
具體策略(ConcreteStrategy)角色:包裝了相關的算法或行為。
二、代碼
/**
* 抽象策略(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()");
}
}
/**
* 環境(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();
}
}