策略模式是属于设计模式中的行为模式中的一种,策略模式主要解决选项过多的问题,避免大量的if else 和 switch下有太多的case。
策略模式的重心不是如何实现算法,而是如何组织、调用这些算法,从而让程序结构更灵活,具有更好的维护性和扩展性@mikechen
策略模式的定义策略(Strategy)模式:该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。
策略是个形象的表述,所谓策略就是方案,日常生活中,要实现目标,有很多方案,
每一个方案都被称之为一个策略
。打个比方说,我们出门的时候会选择不同的出行方式,比如骑自行车、坐公交、坐火车、坐飞机、坐火箭等等,这些出行方式,每一种都是一个策略。
再比如我们去逛商场,商场现在正在搞活动,有打折的、有满减的、有返利的等等,其实不管商场如何进行促销,说到底都是一些算法,这些算法本身只是一种策略,并且这些算法是随时都可能互相替换的,比如针对同一件商品,今天打八折、明天满100减30,这些策略间是可以互换的。
在软件开发中也常常遇到类似的情况,实现某一个功能有多个途径,此时可以使用一种设计模式来使得系统可以灵活地选择解决途径,也能够方便地增加新的解决途径,这就是策略模式。
策略模式的结构这个模式涉及到三个角色:
1.环境(Context)角色持有一个策略类的引用,提供给客户端使用。
2.抽象策略(Strategy)角色这是一个抽象角色,通常由一个接口或抽象类实现,此角色给出所有的具体策略类所需的接口。
3.具体策略(ConcreteStrategy)角色实现了抽象策略定义的接口,包装了具体的算法或行为。
策略模式的实现1.创建抽象策略类
package com.mikechen.java.design.strategy; /** * 抽象策略类 * * @author mikechen */publicinterfaceStrategy{ /** * 策略方法 */publicvoidstrategyInterface(); }2.创建具体策略
1)具体策略A
packagecom.mikechen.java.design.strategy; /** * 具体策略A * * @authormikechen */publicclassConcreteStrategyAimplementsStrategy{ @OverridepublicvoidstrategyInterface(){ System.out.println("执行策略A"); } }2)具体策略B
packagecom.mikechen.java.design.strategy; /** * 具体策略B * * @authormikechen */publicclassConcreteStrategyBimplementsStrategy{ @OverridepublicvoidstrategyInterface(){ System.out.println("执行策略B"); } }3.创建环境类
package com.mikechen.java.design.strategy; /** * 环境类 * * @author mikechen */publicclassContext{//持有一个具体策略的对象privateStrategy strategy; /** * 构造函数,传入一个具体策略对象 * @param strategy 具体策略对象 */publicContext(Strategy strategy){ this.strategy = strategy; } /** * 策略方法 */publicvoidcontextInterface(){ strategy.strategyInterface(); } }策略模式的优缺
1.优点
算法可以自由切换避免使用多重条件判断(如果不用策略模式我们可能会使用多重条件语句,不利于维护)扩展性良好,增加一个策略只需实现接口即可2.缺点
策略类数量会增多,每个策略都是一个类,复用的可能性很小所有的策略类都需要对外暴露策略模式的应用场景
多个类只有算法或行为上稍有不同的场景算法需要自由切换的场景需要屏蔽算法规则的场景出行方式,自行车、汽车等,每一种出行方式都是一个策略商场促销方式,打折、满减等