LVOOP设计模式在路上(二)-- 策略模式
前言
最近工作还挺忙的,连着好些周都是单休了,今天休息在家就来写写关于策略模式的理解和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
LVOOP设计模式在路上(二)-- 策略模式的更多相关文章
- JavaScript设计模式 样例二 —— 策略模式
策略模式(Strategy Pattern): 定义:定义了一族算法: 封装了每个算法: 这族的算法可互换代替. 目的:将算法的使用与算法的实现分离开来. 场景:可用来消除大量的条件分支语句. 例:J ...
- php设计模式课程---6、策略模式如何使用
php设计模式课程---6.策略模式如何使用 一.总结 一句话总结:比如代码需求,做一饭店,有南北方不同菜系,不同分店有不同的饭菜汤的需求,代码怎么设计 从饭店有特色过渡到厨师有特色(南方厨师(南方饭 ...
- JavaScript设计模式与开发实践 - 策略模式
引言 本文摘自<JavaScript设计模式与开发实践> 在现实中,很多时候也有多种途径到达同一个目的地.比如我们要去某个地方旅游,可以根据具体的实际情况来选择出行的线路. 如果没有时间但 ...
- Java设计模式(18)策略模式(Strategy模式)
Strategy是属于设计模式中 对象行为型模式,主要是定义一系列的算法,把这些算法一个个封装成单独的类. Stratrgy应用比较广泛,比如,公司经营业务变化图,可能有两种实现方式,一个是线条曲线, ...
- <二>读<<大话设计模式>>之策略模式
又和大家见面了.可以坚持写出第二篇文章真不错,好好加油. <<大话设计模式>>解说策略模式是以商场收银软件程序开头的,那么问题来了.哪家商场收银软件强,开玩笑了. 读过上篇文章 ...
- Java学习笔记——设计模式之二.策略模式
明确是王道 --Clean Code 先定义策略类 package cn.no2.strategy; public abstract class Strategy { //省略属性 //算法方法 pu ...
- php设计模式-------(1)策略模式
一.为什么我要学习设计模式. 我的上一个项目是做App接口,由于时间紧,老板催的急,所以到最后项目完工时发现居然写了几万行代码,可想而知代码质量有多糟糕.而且很多时候,调用接口的开发人员来找我说某个接 ...
- javascript设计模式详解之策略模式
接上篇命令模式来继续看下js设计模式中另一种常用的模式,策略模式.策略模式也是js开发中常用的一种实例,不要被这么略显深邃的名字给迷惑了.接下来我们慢慢看一下. 一.基本概念与使用场景: 基本概念:定 ...
- C#设计模式之十九策略模式(Stragety Pattern)【行为型】
一.引言 今天我们开始讲“行为型”设计模式的第七个模式,该模式是[策略模式],英文名称是:Stragety Pattern.在现实生活中,策略模式的例子也非常常见,例如,在一个公司中,会有各种工作人员 ...
随机推荐
- _ZNote_Qt_QtCreator_Tips_粘贴_历史剪切板
发现 快捷键 Shift+Command + V 能够出现历史剪切板. 厉害了我的歌
- noip第19课资料
- Adobe reader multiple languages pack
用户打开客户发过来的PDF文档,显示不正常,这是电脑的Adobe Reader缺少相关的字体. 可以从下面地址下载相对版本的字体包安装:http://supportdownloads.adobe.co ...
- WebRTC 学习之 WebRTC 简介
本文使用的WebRTC相关API都是基于Intel® Collaboration Suite for WebRTC的. 相关文档链接:https://software.intel.com/sites/ ...
- jQuery基础与JavaScript与CSS交互-第五章
目录 JavaScript框架种类及其优缺点 jQuery库 jQuery对象$ 掌握基本选择器 掌握过滤选择器 掌握表单选择器 RIA技术 常见的RIA技术 Ajax Sliverlight Fle ...
- [Swift]键盘遮挡控件
键盘遮挡控件: super.viewDidLoad(){ // Do any additional setup after loading the view, typically from a nib ...
- LabVIEW(十一):条件结构的巧用
一.LabVIEW中条件结构使用起来并不是那么简便,主要体现在两点: 1.由隧道的产生引起的一些问题.(当箭头停留在隧道处时不显示为“自动索引隧道”,所以此隧道非彼隧道) 2.由多层结构判断引起的不易 ...
- maven配置多仓库的方法
刚接触maven就是在公司里配置好的,所以一直以来使用都没毛病,所以一直没有去动这些固有的东西. 但是,后来把公司的电脑拿回家之后,发现有的东西就搞不起来了.原因也看一下就明白了,因为在公司的时候用的 ...
- [P4318] 完全平方数
想不出什么办法能直接算的(别跟我提分块打表),不如二分答案吧:设\(f(x)=\sum_{i=1}^n [i不是"完全平方数"]\), 显然f(x)与x正相关.再结合筛法.容斥,不 ...
- odoo开发笔记 -- 升级模块 提示外部ID找不到
可能的原因: 排查顺序: 1.id在视图中的加载顺序问题. 可能是:__manifest__.py文件,view文件先后加载顺序有问题:也可能是:xml 视图文件中,被引用的id出现在了引用id的下方 ...