模式概述:
能让你定义一系列算法, 并将每种算法分别放入独立的类中, 以使算法的对象能够相互替换。
使用场景:
1.当你想使用对象中各种不同的算法变体, 并希望能在运行时切换算法时, 可使用策略模式。
2.当你有许多仅在执行某些行为时略有不同的相似类时, 可使用策略模式。
3.如果算法在上下文的逻辑中不是特别重要, 使用该模式能将类的业务逻辑与其算法实现细节隔离开来。
4.当类中使用了复杂条件运算符以在同一算法的不同变体中切换时, 可使用该模式。
代码样例:
代码背景: 在地图上输入起点和终点,点击生成导航路线;根据客户端选择的不同策略生成不同的导航路线,包括自驾、公交、步行等。
/**
* 策略基类
*/
public interface Strategy {
String createRoute(String start,String end);
}
/**
* 自驾策略
*/
public class ByCarStrategy implements Strategy{
@Override
public String createRoute(String start, String end) {
return new String("北京路直行2公里,左拐进入上海路,直行300到达目的地");
}
}
/**
* 公交策略
*/
public class ByBusStrategy implements Strategy{
@Override
public String createRoute(String start, String end) {
return new String("天安门站坐1路公交车,上海站换成2路公交车,天津路下车到达目的地");
}
}
/**
* 步行策略
*/
public class ByFootStrategy implements Strategy{
@Override
public String createRoute(String start, String end) {
return new String("当前直行100米到达中央公园,穿越中央花园右拐进入上海路,沿着上海路直行200米到达目的地");
}
}
/**
* 上下文
*/
public class Context {
private Strategy strategy;
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
public String excute(String start,String end){
if(strategy ==null) strategy = new ByCarStrategy();//默认自驾策略
return strategy.createRoute(start,end);
}
}
public class TestStrategy {
public static void main(String[] args) {
String type = args[0];
Context context = new Context();
if ("car".equals(type)) context.setStrategy(new ByCarStrategy());
else if("bus".equals(type)) context.setStrategy(new ByBusStrategy());
else if("foot".equals(type)) context.setStrategy(new ByFootStrategy());
System.out.println(context.excute("地球","火星"));
}
}
调用入参使用foot:进行调用:
调用结果: