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.在现实生活中,策略模式的例子也非常常见,例如,在一个公司中,会有各种工作人员 ...
随机推荐
- 展示博客---Alpha版本展示
Alpha版本展示 1. 团队成员的简介和个人博客地址,团队的源码仓库地址. 成员 简介 个人博客地址 祁泽文 被动态统计图搞扒下的我 http://www.cnblogs.com/jiaowoxia ...
- 32 bit 与 64 bit 程序(1)如何识别?
一, 怎样判断一个exe可执行程序是32位的还是64位的? 简单的方法: 一般来说在64位的windows7下,打开任务管理器可以知道哪些程序是32位的哪些是64位的,但是因为自己的电脑是64位的wi ...
- Cura - CuraEngine - 架构分析
参考: https://blog.csdn.net/justdoithai/article/details/52746094
- Flask实例化的参数 及 对app的配置
首先展示一下: from flask import Flask app = Flask(__name__) # type:Flask app.config["DEBUG"] = T ...
- Shell-12 -- case
case 是一种匹配选择执行的结构,相当于java中的switch
- javaScript 节流与防抖
首先 我们要知道 节流与防抖可以干什么. 优化网络请求性能——节流 优化页面请求性能——防抖 举两个简单的小例子: 节流: 例如 有些购物页面,会有一些让你抢购的活动,到点的时候,需要你快速的点某个按 ...
- 从CSR产品名录看公司发展历程和业务方向
产品型号 主要功能 BC3系列(例BC31A223, ...
- [Leetcode]827.使用回溯+标记解决最大人工岛问题
在二维地图上, 0代表海洋, 1代表陆地,我们最多只能将一格 0 海洋变成 1变成陆地. 进行填海之后,地图上最大的岛屿面积是多少?(上.下.左.右四个方向相连的 1 可形成岛屿) 示例 1: 输入: ...
- List通过HashSet去重
//JAVA中//使用hashset去重复,set为重复的集合,可以通过new ArrayList(set)转换成list HashSet<HashMap<String, String&g ...
- C#单元测试分享ppt
单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证.对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Java里单元指一个类, ...