一、定義
定義算法家族,分別封裝起來,讓他們之間可以互相替換,此模式讓算法的替換不會影響到使用算法的客戶。
二、特點
可以以相同的方式調用所有的算法(可以通過類繼承的向上轉型或者一個接口多個實現類的方式),減少了各種算法類與使用算法類之間的耦合[DPE]。簡化單元測試,每個算法都有自己的類,可以通過自己的接口單元測試。
將算法行爲封裝在一個個獨立的類中,可以在使用這些行爲的類中消除條件語句
三、結構圖
四、示例代碼
1、策略抽象類Strategy.java
/**
* 策略抽象類
* @author lattice
*
*/
public abstract class Strategy {
public abstract void algorithmInterface();
}
/**
* 策略抽象類子類,實現抽象方法
* @author lattice
*
*/
class ConcreteStrategyA extends Strategy{
@Override
public void algorithmInterface(){
System.out.println("策略A實現方法");
}
}
class ConcreteStrategyB extends Strategy{
@Override
public void algorithmInterface(){
System.out.println("策略B實現方法");
}
}
class ConcreteStrategyC extends Strategy{
@Override
public void algorithmInterface(){
System.out.println("策略C實現方法");
}
}
2、策略調度類context.java/**
* 策略調度類
* @author lattice
*
*/
public class Context {
Strategy strategy;
public Context(Strategy strategy){
this.strategy=strategy;
}
public void ContextInterFace(){
//根據具體的策略對象,調用其算法的方法
this.strategy.algorithmInterface();
}
}
3、使用類Action.java
/**
* @策略模式實現
* 策略模式就是用來封裝算法的,把一系列的算法封裝到Strategy抽象類衍生的子類中,
* 用Context來控制不同算法的調用
* @author lattice
* @date 2016-12-21
*/
public class Action {
public static void main(String[] args) {
Context context;
context=new Context(new ConcreteStrategyA());
context.ContextInterFace();
context=new Context(new ConcreteStrategyB());
context.ContextInterFace();
context=new Context(new ConcreteStrategyC());
context.ContextInterFace();
}
}