Zero&Retry 阅读(90) 评论(0)

前言

最近工作还挺忙的,连着好些周都是单休了,今天休息在家就来写写关于策略模式的理解和labivew的实现。

正文

1.什么是策略模式

定义是这样描述的:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。

看下它的类图如下所示:

 

对变化点进行抽象和封装是oop的一种重要的思维,从上图可看出有个抽象的算法策略类,定义了所有支持的算法的公共接口;然后根据不同的算法定义不同的具体策略类,再通过一个Context类去进行配置和维护一个对Strategy对象的引用;UML图看着如果有困难,请自行学习。

2. 代码实现

1)书中以“商场收银软件”为例,接下来看看用LabVIEW如何实现。软件需求:根据商品的单价和数量,向客户收费(商场经常会推出各种各样的活动);为了便于扩展和维护考虑使用OOP策略模式,这里以三种活动为例(正常收费,打折,满多少返多少),类图结构如下所示:

 

2)labview项目创建实现

创建一个Strategy抽象类,定义一个收银的公共接口AlgorithmInterface(),然后创建三个具体的活动策略类(StrategyA-Normal, StrategyB-CashRebate, StrategyC-CashReturn),继承自Strategy类,分别实现AlgorithmInterface()方法,并根据自己的活动规则新增自己独有的成员,如StrategyB-CashRebate,需要定义一个成员来确定打几折。

再定义一个CashContext类,用此类将客户端的使用和收费算法进行分离,使得耦合程度更低,当需求发生变化要新增一种活动方式时,客户端代码无需修改,只需新增一个具体的策略类和修改CashContext类的配置策略方法即可。CashContext类中定义了两个方法(CreateCashContext()--配置具体的策略, GetCash()--获取收费金额)

然后在客户端中进行功能实现即可,如下图所示:

运行效果如下图所示,

3)变更需求(新增一种活动)

 假设活动是“满100送一双棉袜”,如何进行扩展呢?首先创建一个新的策略D,然后实现AlgorithmInterface()方法。然后在CreateCashContext()方法中新增创建策略D即可完成扩展,如下图所示。

运行效果如下:

运用了OOP使得扩展变得如此轻松,还需自己好好体会什么时候采用此模式,刚开始个人觉得策略模式和工厂模式在结构上很相似,细细思考区别还是比较明显的:工厂模式主要是不同对象的创建,关注点在对象的创建上;策略模式主要是一个对象可以选择不同行为,是一种行为模式,关注点在不同行为的封装;如果还有犯迷糊的小伙伴可以参考“大CC”的一篇博文http://www.cnblogs.com/me115/p/3790615.html,介绍了二者的区别,比较浅显易懂。

4)源码分享

https://demo.gitee.com/ZeroRetry/codes/5vdrni2jmyqb7w81x4th990