设计模式之策略模式

本文探讨了策略模式在收银软件中的应用,通过封装不同的收费算法,如折扣和积分,实现了算法的互换性和扩展性,同时结合工厂模式简化了客户端代码。

策略模式定义(Strategy):它定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。

定义看起来还是太抽象,接下来我们看一个书上的例子,如何实现一个商场收银软件,有好几种收费的方式,比如不同的折扣、满300返100等等。这里先用简单的工厂模式实现一下(UML图实现)

上面就是利用简单的工厂模式来实现这个收银软件,这里注意一下,有人可能会说为什么不是一个折扣一个类,我们要清楚,面向对象编程,并不是类越多越好,类的划分是为了封装,但分类的基础是抽象,具有相同的属性和功能的抽象集合才是类。打不同的折扣只是形式的不同,算法都是一样的。

但是上面的工程模式实现还是有一个问题,如果我再增加一个促销手段,比如满100元加10积分,积分到了一定的程度可以换商品呢,其实也简单,加一个积分算法,构造方法有两个参数:条件和返点,然后在工厂模式的switch里面加一个分支即可。但是商场肯定会经常有不同的折扣,这样会造成频繁修改工厂,会导致代码需要频繁的更换和编译,对于这种算法时常改动,我们就需要使用到策略模式

先看看策略模式的UML图

这个类图就把策略模式的结构理的很清楚了,在Context中以策略的抽象类作为变量,在使用的时候只需要实例化Context将具体的策略作为参数传递给构造方法调用ContextInterf方法即可。这个时候改造之前的收银软件,UML图如下

但是这样的策略模式还有一个问题,就是客户端会有很多冗余的代码,需要做大量的判断来觉决定使用哪一种策略,这里就可以将工厂模式和策略模式灵活的运用在一起了 ,在CashContext这个类的构造方法里面把之前的工厂模式写进去,这样客户端的代码就会很简单了。对比之前的工厂模式和现在工厂模式+策略模式,有一个很大的区别,纯工厂模式的客户端需要出现两个类,一个CashSuper和CashFactory而工厂模式+策略模式仅仅只需要一个CashContext类即可,耦合度更加低了。

总结一下策略模式的优点:

1、它可以以相同的方式调用所有的算法,减少了各种算法与使用算法之间的耦合。

2、策略模式的Strategy类层次为Context定义了一系列的可供重用的算法或行为。继承有助于吸取出这些算法中的公共功能。

3、策略模式简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。

策略模式就是用来封装算法的,但在实践中,我们发现可以用它来封装几乎任何类型的规则,只要在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。在基本的策略模式中,选择所用具体实现的职责由客户端对象承担,并转给策略模式的Context对象。并没有解除客户端的压力,而是策略模式和工厂模式结合之后,选择具体的实现的职责也有Context来承担,最大化的减轻了客户端的职责。

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值