策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化,降低了各种算法类与使用算法类之间的耦合。
Strategy:模拟客户端调用
Trip :出行方式接口
TripByBoot,TripByCar,TripByTrain,Trip接口的实现类
模拟一个去西藏的例子,去西藏的方式有很多,可以步行,可以开车去,可以坐火车。
去西藏的方式,就是策略模式中的算法,每种方式就代表一种算法,客户端根据需要选择不同的算法
首先出行方式接口
public interface Trip {
public String execute();
}
三个出行方式
public class TripByBoot implements Trip {
@Override
public String execute() {
System.out.println("100双鞋已经买好,随时可以出发。");
return "";
}
}
public class TripByCar implements Trip {
@Override
public String execute() {
System.out.println("汽车已经准备好,随时可以出发。");
return "";
}
}
public class TripByTrain implements Trip {
@Override
public String execute() {
System.out.println("火车票已经买好,随时可以出发。");
return "";
}
}
模拟客户端
public class Strategy {
public void trip(String tripModle){
Trip trip = null;
switch (tripModle) {
case "car":
trip = new TripByCar(); // 开车去西藏
break;
case "Train":
trip = new TripByTrain(); // 坐火车去西藏
break;
case "Boot":
trip = new TripByBoot(); //徒步去西藏
break;
default:
System.out.println("不支持" + "出行方式"); // 不能做飞机,因为直接升到高海拔,高反受不了
}
if (trip != null){
trip.execute();
}
}
public static void main(String[] args) {
Strategy strategy = new Strategy();
strategy.trip("Train");
strategy.trip("Boot");
strategy.trip("car");
strategy.trip("airplane");
}
}
策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码转移到父类里面,从而避免重复的代码。
使用策略模式可以避免使用多重条件转移语句。多重转移语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重转移语句里面,比使用继承的办法还要原始和落后。
对客户隐藏具体策略(算法)的实现细节,彼此完全独立。
针对同一类型问题的多种处理方式,仅仅是具体行为有差别时。
一个类定义了很多行为,而且这些行为在这个类里的操作以多个条件语句的形式出现。策略模式将相关的条件分支移入它们各自的 Strategy 类中以代替这些条件语句。