策略模式
1. 策略模式的定义
策略模式定义了一系列算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而存在。
2. 策略模式的使用场景
程序中出现对用一种业务问题存在多种处理方式,处理方式上也仅仅是具体的逻辑(也叫行为)上有所区别,而行为上未来也许会产生变化,或者砍掉的情况。
其实策略模式它是一种行为型的设计模式,利用了面向对象的继承和多态机制。所以使用时我们需要提取出行为中的相同之处,且不容易发生变化的东西,把它们抽取到超级抽象类中,让子类去继承它们;再找出行为中的不同之处,容易产生变化的地方,把它们独立出来,做单独的切换。
通常来说,我们写程序都是比较简单的代码,意思是if else 很简单的逻辑设计处理,它会缺少灵活性,代码很生硬,只要产生一小许变化就需要修改,产生大量的工作消耗,这样的代码顶多就是在当前的业务环境下可用,一旦改变代码或者换个应用环境就废了,这就是设计的简单造成的。所以才有设计模式的出现。
简单的设计代码就像下面的代码一样:
根据支付方式使用 if else判断需要调用的支付实现类,高度耦合,以后增加又需要修改代码,代码不可复用。
可能你在程序中使用就是加多个接口:
这样子耦合度大大降低,只要实现接口即可,无需做其他修改。但是随着支付类的增多,代码会越来越多,接口代码不能真正实现代码的复用。
现在我们仅仅是微信增加一个撤销支付的功能,为了不会影响到既有的行为类,所以我们就需要引入新的接口RepealInterface
撤销接口 微信测校实现类 支付宝撤销实现类 支付宝支付 微信支付然后我们利用接口的多态机制,动态的去切换调用的接口,代码如下:
接下来就是组合行为类
通过上面的代码, 我们就实现了具体的策略算法和步骤,可以随意的组合行为,需要新的行为只需要增加(扩展)一个就好,不会对已有的代码进行修改。遵守了我们的一个原则:开闭原则(软件中的对象(类,模块、函数等)应该对于扩展是开放的,对于修改的封闭的)
策略模式抽象出来分类的话就如下这三部分:
【抽象策略】Strategy : 通常由接口/抽象类实现,给出具体的策略所需要的方法。也就是上面的payInterface / repealInterface接口
【具体策略】ConcreteStrategy : 具体实现的策略算法和步骤。对应WechatPay,ZhifubaoPay / WeChatRepeal,ZhifubaoRepeal实现类
【封装类】Context : 持有一个Strategy的引用。对策略二次封装,避免了对策略的直接使用。对应BehaviorUtil
调用层:外围调用的service层继承了BehaviorUtil的两个对象WeChatPayAndRepealImpl,ZhifubaoPayImpl