摘自《Java設計模式(瘋狂JAVA聯盟版)》
概述
定義一系列的算法,把它們一個個封裝起來,並且使它們可相互替換。本模式使得算法可獨立於使用它的客戶而變化。
適用性
1.許多相關的類僅僅是行爲有異。“策略”提供了一種用多個行爲中的一個行爲來配置一個類的方法。
2.需要使用一個算法的不同變體。
3.算法使用客戶不應該知道的數據。可使用策略模式以避免暴露覆雜的、與算法相關的數據結構。
4.一個類定義了多種行爲,並且這些行爲在這個類的操作中以多個條件語句的形式出現。
將相關的條件分支移入它們各自的Strategy類中以代替這些條件語句。
參與者
1.Strategy
定義所有支持的算法的公共接口。Context使用這個接口來調用某ConcreteStrategy定義的算法。
2.ConcreteStrategy
以Strategy接口實現某具體算法。
3.Context
用一個ConcreteStrategy對象來配置。
維護一個對Strategy對象的引用。
可定義一個接口來讓Stategy訪問它的數據。
類圖
例子
public abstract class Strategy {
public abstract void method();
}
public class StrategyImplA extends Strategy {
public void method() {
System.out.println("這是第一個實現");
}
}
public class StrategyImplB extends Strategy {
public void method() {
System.out.println("這是第二個實現");
}
}
public class StrategyImplC extends Strategy {
public void method() {
System.out.println("這是第三個實現");
}
}
public class Context {
Strategy stra;
public Context(Strategy stra) {
this.stra = stra;
}
public void doMethod() {
stra.method();
}
}
public class Test {
public static void main(String[] args) {
Context ctx = new Context(new StrategyImplA());
ctx.doMethod();
ctx = new Context(new StrategyImplB());
ctx.doMethod();
ctx = new Context(new StrategyImplC());
ctx.doMethod();
}
}
這是第一個實現
這是第二個實現
這是第三個實現