定義
策略模式定義了一系列的算法,並將每一個算法封裝起來,而且使它們還可以相互替換。策略模式讓算法獨立於使用它的客戶而獨立變化
角色
策略接口(Strategy):爲一系列策略算法提供一個統一接口
具體策略:實現策略接口,並實現其中的算法
上下文:負責策略的切換,內含Strategy引用
優點
- 提供了管理某一類算法的辦法
- 提供了可以替換繼承關係的辦法,同時又保留了繼承代碼重用的優點
- 讓系統更加靈活、易擴展
缺點
- 每個算法都有一個策略類,策略類太多
- 用戶必須知道有哪些策略類,而且要知道不同策略類算法的不同
適用場景
- 許多相似的類,他們只是算法(策略)不同
- 具體算法實現不想讓用戶看到時
- 在需要實現不同策略的時候
類圖
package com.vapy.behavior.Strategy;
/**
*
* @author vapy
*
*/
public interface Strategy {
public int calc(int a, int b);
}
package com.vapy.behavior.Strategy;
/**
*
* @author vapy
*
*/
public class Add implements Strategy {
@Override
public int calc(int a, int b) {
return a + b;
}
}
package com.vapy.behavior.Strategy;
/**
*
* @author vapy
*
*/
public class Sub implements Strategy {
@Override
public int calc(int a, int b) {
return a - b;
}
}
package com.vapy.behavior.Strategy;
/**
*
* @author vapy
*
*/
public class Context {
private Strategy strategy;
public Context(){}
public Context(Strategy strategy) {
this.strategy = strategy;
}
public Strategy getStrategy() {
return strategy;
}
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
public int calc(int a, int b) {
return this.strategy.calc(a, b);
}
}
package com.vapy.behavior.Strategy;
/**
*
* @author vapy
*
*/
public class Client {
public static void main(String[] args) {
Context context = new Context(new Add());
System.out.println(context.calc(3, 5));
context.setStrategy(new Sub());
System.out.println(context.calc(3, 5));
}
}
本文代碼可在github查看:點擊此處