Java 策略模式
理解策略模式
举个例子:
我们去海南游玩,出行的方式有很多种,比如我们坐 火车、高铁、飞机、游船等等。但是不管我们使用哪一种出行方式,咱们的最终目的就是去三亚游玩 (归纳起来也就是,选择不同的方式产生的结果都是一样的。)
![](https://img2020.cnblogs.com/blog/1443576/202008/1443576-20200806235950032-2070361073.png)
策略模式的优缺点
优点
-
策略模式遵循开闭原则,实现代码的解耦合,扩展新的方法,只需要继承策略接口。
缺点
-
客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
-
实现策略模式
由上可知 策略模式把 对象(咱们)本身 和 出行方式选择 区分开来,因此 咱们将整个模式分解为 三部分
-
环境类(Context):用来操作策略的上下文环境,也就是咱们。
-
抽象策略类(Strategy):策略的抽象,出行方式的抽象
-
具体策略类(ConcreteStrategy):具体的策略实现,也就是每一种 出行方式的具体实现。
1、定义抽象策略接口
/** * 出行策略接口 * @author oukele */ public interface TravelStrategy { /** * 抽象的出行方式 */ void useFunction(); }
2、具体策略类
1、火车 /** * 火车出行方式的具体实现类 * @author oukele */ public class Train implements TravelStrategy { @Override public void useFunction() { System.out.println("乘坐火车去三亚...."); } } 2、飞机 /** * 飞机出行方式的具体实现类 * @author oukele */ public class Aircraft implements TravelStrategy { @Override public void useFunction() { System.out.println("乘坐飞机去三亚...."); } } 3、高铁 /** * 高铁出行方式的具体实现类 * @author oukele */ public class HighSpeedTrains implements TravelStrategy { @Override public void useFunction() { System.out.println("乘坐高铁去三亚...."); } }
3、环境类
public class Myself { private TravelStrategy travelStrategy; /** * 设置 游客出行的方式 * @param travelStrategy 出行方式接口的具体实现类 */ public void setTravelFunction(TravelStrategy travelStrategy){ this.travelStrategy = travelStrategy; } /** * 显示当前游客是以什么方式出行的 */ public void travelFunction(){ travelStrategy.useFunction(); } public static void main(String[] args) { // new出一个游客 Myself myself = new Myself(); // 选择的出行方式 //1. 火车 //myself.setTravelFunction(new Train()); //2. 飞机 myself.setTravelFunction(new Aircraft()); //3. 高铁 //myself.setTravelFunction(new HighSpeedTrains()); // 显示当前选择出行的方式 myself.travelFunction(); } }
由于 这里选择了 飞机的出行方式,所以它的结果为:
乘坐飞机去三亚....