一、定义
策略模式:策略是对算法的封装,是一种形为模式,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。
二、实现
1、范例 - 曹操败走华容道
三国演义中曹操败走华容道的故事,相传在赤壁之战之后,曹操的船舰被刘备烧了,曹操逃离时面前有两条路:1、平坦的大路。2、泥泞的华容道。面对这两条路,曹操没有选择大路而选择有炊烟的小路「华容道路」,理由—实则虚之,虚则实之,那么曹操在选择道路的时候其实就是选择策略。
2、UML
3、代码
主接口
/**
* 抽象的策略,定义逃跑路线
*/
public interface IRunStrategy {
// 逃跑线路
void escapeRoute() ;
}
具体策略(多种策略),实现接口
1.大路
/**
* 具体的策略一走大路
*/
public class Highroad implements IRunStrategy {
@Override
public void escapeRoute() {
System.out.println("走大路");
}
}
2.华容道
/**
* 具体的策略二走华容道
*/
public class HuaRongRoad implements IRunStrategy {
@Override
public void escapeRoute() {
System.out.println("走华容道");
}
}
定义上下文
/**
* 上下文 持有 IRunStrategy 的引用
*/
public class ContextRunStrategy {
private IRunStrategy iRunStrategy ;
public ContextRunStrategy(IRunStrategy iRunStrategy){
this.iRunStrategy = iRunStrategy ;
}
/**
* 选择道路
*/
public void choiceRoad(){
iRunStrategy.escapeRoute();
}
}
用户选择,选择路线(即选择策略)
/**
* 曹操选择路线
*/
public class CaoCao {
public static void main(String args[]){
/**
* 曹操疑心重,选择了华容道,对曹操来说至于杂样走华容道,不关心,死多少人也不关心,只关心我要走这条道就好
*/
IRunStrategy huaRongRoad = new HuaRongRoad() ; //多态:向上转型。此时就是选择一种实现方式的策略
ContextRunStrategy contextRunStrategy = new ContextRunStrategy(huaRongRoad) ;
contextRunStrategy.choiceRoad();
}
}
其实这种模式在平常的代码中常用,封装一个主接口,然后通过实现接口,重载方法实现不同功能。然后不同用户根据自己的选择,然后不同的实现方法。这就是一种策略。
注意:和工厂模式的逻辑有点类似。
摘抄:
https://segmentfault.com/a/1190000011918366#articleHeader4