策略模式之Map+函数式接口
1.什么是策略模式
策略模式在设计模式中属于行为型模式。他指同一个事情中某些行为或者算法,随着条件的不同,而发生变化。
也就是说,为完成同一件事情,有很多不同的实现方式。我们将这些不同的方式,封装成一个个独立的方法或者类,根据不同的条件触发他,这就是策略模式。
在日常生活中,有很多例子描述策略模式:
去旅行,我们交通方式可以是走路,开车,坐火车,坐飞机,各种各样的方式,都实现了到旅行地的目的。
扫码支付,我们可以使用微信,支付宝,云闪付,不同的手段,也都实现了付款的目的。
2.为什么要使用策略模式
主要解决问题:
策略模式主要解决的是如何组织、调用算法,从而让程序结构更灵活、具有更好的维护性和扩展性。
优点:
- 算法,行为可以自由定义,自由切换
- 避免使用多重条件判断语句
- 扩展性良好
3.怎么使用策略模式
常规实现策略模式的方法,有多种多样:注解式,工厂方法式等。
1.工厂方法实现策略模式
以旅行为例:
1.首先定义旅行行为接口publicinterfaceTravel { voidgo(); } 2.定义旅行方式工厂publicclassTravelStrategyFactory { privatestaticMap<String, Travel>map=newHashMap<>(); publicstaticvoidregister(Stringcode, Traveltravel) { if (StringUtils.isNotEmpty(code)) { map.put(code, travel); } } publicstaticTravelget(Stringcode) { returnmap.get(code); } } 3.实现旅行行为逻辑//火车出行publicclassTrainimplementsTravel{ publicvoidinit(){ TravelStrategyFactory.register("train",this); } publicvoidgo() { System.out.println("火车"); } } //步行出行publicclassWalkimplementsTravel{ publicvoidinit(){ TravelStrategyFactory.register("walk",this); } publicvoidgo() { System.out.println("步行"); } } 4.出去旅游publicstaticvoidmain(String[] args) { TravelStrategyFactory.get("train").go(); }
以上就是一个完整策略模式实现,代码很简洁,逻辑清晰,扩展性很好,但是他也有几个缺点:
1.他的扩展性,强制必须新建类,来实现不同的行为,一旦行为过多,类文件就会比较多
2.这种方式没有一个地方可以对全局业务做到俯视,各自为战,有时候,很容易出错
2.Map+函数式接口实现策略模式(建议使用)
Map+函数式接口采用jdk 1.8的函数式编程的新特性,用来实现策略模式,更加简单,更加自由。
同样以旅行为例:
publicclassStrategy { privateTravelServicetravelService; //有返回值用Function接口,无返回值用Consumer接口privateMap<Integer, Consumer<String>>typeMap=newHashMap<>(); publicvoiddispatcherInit(){ typeMap.put("walk", id->travelService.walk(id)); typeMap.put("train", id->travelService.train(id)); } publicstaticvoidmain(String[] args) { Consumer<String>consumer=typeMap.get("walk"); if(Objects.nonNull(consumer)){ consumer.accept("id"); } } } publicclassTravelService { publicvoidwalk(Stringid) { System.out.println("步行"); } publicvoidtrain(Stringid) { System.out.println("步行"); } }
可以看到这种方式比传统策略模式,实现起来简单好理解,扩展起来非常自由,可以使用inteface扩展,也可以调服务方法执行对应逻辑,并且在定义策略的时候,可以看到所有策略情况,便于对业务全局进行把控。