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.在现实生活中,策略模式的例子也非常常见,例如,在一个公司中,会有各种工作人员 ...
随机推荐
- FastDFS分布式文件系统配置文件详解
一.tracker配置文件详解: # is this config file disabled# false for enabled# true for disableddisabled=false# ...
- ZZ 使用Jenkins配置Git+Maven的自动化构建
http://blog.csdn.net/xlgen157387/article/details/50353317 Jenkins是帮我们将代码进行统一的编译打包.还可以放到tomcat容器中进行发布 ...
- DataBrewery Cubes 连接Kylin
问题背景 Kylin作为一个极其优秀的MOLAP,提供了完整的Cube创建.更新流程.同时提供了Sql查询.功能上看没有问题,但是在提供查询服务的时候还是有些不友好. sql查询需要常常需要关联Hiv ...
- 人生苦短:Python里的17个“超赞操作
人生苦短,我选Python”.那么,你真的掌握了Python吗? 1. 交换变量 有时候,当我们要交换两个变量的值时,一种常规的方法是创建一个临时变量,然后用它来进行交换.比如: # 输入 a = ...
- vscode 编辑器常用快捷键
最近,打算换个编辑器,而 vscode 是一个不错的选择.大部分快捷键和 sublime 还是很像的,但有些也不一样.特此整理一份小笔记. 参考: vscode: Visual Studio Code ...
- [宏]preempt_disable
//include/linux/preempt.h #ifdef CONFIG_PREEMPT_COUNT //如果内核支持抢占 do { \ inc_preempt_count(); \ barri ...
- 【xsy2305】喽 计算几何
UPD:这个做法被hack了 题目大意:给你$n$个红点和$m$个黑点,问你至少需要保留多少个黑点,才能用由黑点组成的凸包包住所有红点. 数据范围:$n≤10^5$,$m≤500$ 首先,我们将红点和 ...
- java开发,年薪15W的你和年薪50W的他的差距
在这个IT系统动辄就是上亿流量的时代,Java作为大数据时代应用最广泛的语言,诞生了一批又一批的新技术,包括HBase.Hadoop.MQ.Netty.SpringCloud等等 . 一些独角 ...
- 本地电脑无法连接到MySQL
问题描述: ERROR 1130 (HY000): Host 'localhost' is not allowed to connect to this MySQL server 首先网上的问题大部分 ...
- django model数据 时间格式
from datetime import datetime dt = datetime.now() print '时间:(%Y-%m-%d %H:%M:%S %f): ' , dt.strftime( ...