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.在现实生活中,策略模式的例子也非常常见,例如,在一个公司中,会有各种工作人员 ...
随机推荐
- ASP.NET Core OceLot 微服务实践
1.OceLot中间件介绍 在传统的BS应用中,随着业务需求的快速发展变化,需求不断增长,迫切需要一种更加快速高效的软件交付方式.微服务可以弥补单体应用不足,是一种更加快速高效软件架构风格.单体应用被 ...
- javaweb中的乱码问题
0.为什么需要编码,解码, 无论是图片,文档,声音,在网络IO,磁盘io中都是以字节流的方式存在及传递的,但是我们拿到字节流怎么解析呢?这句话就涉及了编码,解码两个过程,从字符数据转化为字节数据就是编 ...
- Servlet-生命周期简介
Servlet生命周期可分为5个步骤 加载Servlet.当Tomcat第一次访问Servlet的时候,Tomcat会负责创建Servlet的实例 初始化.当Servlet被实例化后,Tomcat会调 ...
- [视频]K8飞刀--WinRAR远程代码执行漏洞利用视频
[视频]K8飞刀--WinRAR远程代码执行漏洞利用视频 链接:https://pan.baidu.com/s/17_0kgNsDejJS0hvgLiMD7A 提取码:zkc2
- POJ 2895
#include <iostream> #include <string> #define MAXN 27 using namespace std; short map[MAX ...
- can only concatenate tuple (not "int") to tuple问题原因
#测试程序 import os from pydub import AudioSegment #已经确定, # enPath = "%s%s/%s"%(enDir,file,enf ...
- python之进程(multiprocess)
有人说测试学习多进程(或多线程)有啥用?额告诉你很有用,特别是在自己写性能测试工具时就可以用到,而且非常方便 这里只介绍非常简单的多进程模块(multiprocessing.Process) 代码如下 ...
- js按钮 防重复提交
给html 按钮加id属性 例: <button id="addBtn" onclinck="check()"> </button&g ...
- eclipse 安装插件报错问题
报错信息 An error occurred while installing the items session context was:(profile=epp.package.jee, phas ...
- hashcode和equals方法的区别和联系
说到 hashcode就要和Java中的集合,HashSet,HashMap 关系最为密切. 首先附录两张Java的集合结构图: 图二:(上图的简化版) 从Set集合的特点说起 & Set是如 ...