美文网首页
策略模式

策略模式

作者: 会九卦的兔子 | 来源:发表于2018-08-12 18:15 被阅读0次

1. 策略模式的定义

       策略模式定义了一系列算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而存在。

2. 策略模式的使用场景

       程序中出现对用一种业务问题存在多种处理方式,处理方式上也仅仅是具体的逻辑(也叫行为)上有所区别,而行为上未来也许会产生变化,或者砍掉的情况。

其实策略模式它是一种行为型的设计模式,利用了面向对象的继承和多态机制。所以使用时我们需要提取出行为中的相同之处,且不容易发生变化的东西,把它们抽取到超级抽象类中,让子类去继承它们;再找出行为中的不同之处,容易产生变化的地方,把它们独立出来,做单独的切换。

通常来说,我们写程序都是比较简单的代码,意思是if else 很简单的逻辑设计处理,它会缺少灵活性,代码很生硬,只要产生一小许变化就需要修改,产生大量的工作消耗,这样的代码顶多就是在当前的业务环境下可用,一旦改变代码或者换个应用环境就废了,这就是设计的简单造成的。所以才有设计模式的出现。

简单的设计代码就像下面的代码一样:

根据支付方式使用 if else判断需要调用的支付实现类,高度耦合,以后增加又需要修改代码,代码不可复用。

可能你在程序中使用就是加多个接口:

这样子耦合度大大降低,只要实现接口即可,无需做其他修改。但是随着支付类的增多,代码会越来越多,接口代码不能真正实现代码的复用。

现在我们仅仅是微信增加一个撤销支付的功能,为了不会影响到既有的行为类,所以我们就需要引入新的接口RepealInterface

撤销接口 微信测校实现类 支付宝撤销实现类 支付宝支付 微信支付

然后我们利用接口的多态机制,动态的去切换调用的接口,代码如下:

接下来就是组合行为类

通过上面的代码, 我们就实现了具体的策略算法和步骤,可以随意的组合行为,需要新的行为只需要增加(扩展)一个就好,不会对已有的代码进行修改。遵守了我们的一个原则:开闭原则(软件中的对象(类,模块、函数等)应该对于扩展是开放的,对于修改的封闭的)

策略模式抽象出来分类的话就如下这三部分:

【抽象策略】Strategy : 通常由接口/抽象类实现,给出具体的策略所需要的方法。也就是上面的payInterface / repealInterface接口

【具体策略】ConcreteStrategy : 具体实现的策略算法和步骤。对应WechatPay,ZhifubaoPay / WeChatRepeal,ZhifubaoRepeal实现类

【封装类】Context : 持有一个Strategy的引用。对策略二次封装,避免了对策略的直接使用。对应BehaviorUtil

调用层:外围调用的service层继承了BehaviorUtil的两个对象WeChatPayAndRepealImpl,ZhifubaoPayImpl

相关文章

网友评论

      本文标题:策略模式

      本文链接:https://www.haomeiwen.com/subject/xghsbftx.html