这样来理解策略模式
我们还记得以前上数学课的时候,老师总是对一个问题进行多种解法进行分析,每一种解决都是一种策略,这就是策略模式的思想。
为了更好的理解这个策略模式,我这边画一个图便于大家快速的理解,比如我们外出旅游需要的交通方式有飞机,高铁,大巴 每一种出行方式都是一种策略方案,不管我们选择那种方式,最终到达的目的地都是一样的。
二,策略模式实际上是把对象本身跟出行方式区分出来,这里可以分成三部分,
- 策略上下文封装角色:其实这里就是指我们的游客
- 抽象策略类:其实就是我们的出行方式,飞机,高铁,大巴
- 具体的抽象实现类:主要看我们一种出行方式的实现类
抽象策略类
public interface TravelStrategy {
//定义抽象出行方式
public void travelStyle();
}
抽象具体实现类
//第一种乘坐大巴
public class BusTrain implements TravelStrategy{
public void travelStyle() {
System.out.println("乘坐大巴");
}
}
//第二种乘坐高铁
public class HightTrain implements TravelStrategy{
public void travelStyle() {
System.out.println("第二种乘坐高铁");
}
}
//第三种乘坐飞机
public class AirStrategy implements TravelStrategy{
public void travelStyle() {
System.out.println("第三种乘坐飞机");
}
}
Context上下文角色,也叫Context封装角色,起承上启下的作用,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化。
public class Context {
//出行策略的接口
TravelStrategy travelStrategy;
//出行策略方案
public void setTravelStrategy(TravelStrategy travelStrategy) {
this.travelStrategy = travelStrategy;
}
//为当前用户设置出行方式
public void travelStyle() {
travelStrategy.travelStyle();
}
}
客户端测试类测试
//客户端测试类
public class Client {
public static void main(String[] args) {
Context context=new Context();
context.setTravelStrategy(new BusTrain());
context.travelStyle();
context.setTravelStrategy(new HightTrain());
context.travelStyle();
context.setTravelStrategy(new AirStrategy());
context.travelStyle();
}
}
出行方案结果
策略模式的优点
- 我们之前在选择出行方式的时候,往往会使用if-else语句,也就是用户不选择A那么就选择B这样的一种情况。这种情况耦合性太高了,而且代码臃肿,有了策略模式我们就可以避免这种现象,
- 扩展性良好,增加一个策略只需实现接口即可
策略模式的缺点
3. 策略类数量会增多,每个策略都是一个类,复用的可能性很小
如果文章有错的地方欢迎指正,大家互相交流