设计模式四:策略模式
策略模式
所谓策略其实就是做一件事情有很多很多的方法,比如说一个商场要搞促销,促销的方式有可能有很多:打折啊,满100返50啊、积分等等之类的。这种不同的促销方式在我们系统中表示就是一个一个的策略,并且策略是可以随时更换的,这个时候在设计系统时就可以使用策略模式。
商场有可能会更换或追加新的促销模式,也就是策略存在调整,也就是会更改以前的代码,为了满足开闭原则,这时就要使用抽象类和接口,这里我们偏向使用接口。在接口里面定义策略的方法,根据不同的情况编写不同的实现类,实现不同的策略,策略模式比较适用于算法经常变化的情况,比如计算工资的方式、出行方式的选择等等。
如图所示,我们先定义策略的接口(Promotion),然后在这个策略接口里定义策略的方法(GetPrice()),接着我们定义了两种具体的策略(Discount打折)和(MoneyBack返现)。
策略模式会专门有一个上下文对象(PromotionContext)专门管理策略类,并且上下文对象和策略接口之间是聚合的关系,也就是整体和部分的关系,因此在上下文对象里应该保存一个促销类型的引用,另外上下文对象里一般会有一些方便客户端调用的方法,如GetPrice()。客户端程序可以通过上下文对象得到价格,这个GetPrice()里会根据不同的策略,执行不同的策略方法。
如果客户端不想使用上下文中定义的默认的策略,也可以去修改策略类,因为上下文中有一个ChangePromotion()的方法,客户端主要使用上下文对象,如果需要修改策略,他还要依赖于具体的策略对象。
示例:
1、策略接口:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace 策略模式 8 { 9 /* 10 策略接口 11 */ 12 public interface IPromotion 13 { 14 /// <summary> 15 /// 根据原价和策略计算新价格 16 /// </summary> 17 /// <param name="originPrice">原价</param> 18 /// <returns></returns> 19 double GetPrice(double originPrice); 20 } 21 }
2、Discount打折策略类
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace 策略模式 8 { 9 /// <summary> 10 /// 打折策略类 11 /// </summary> 12 public class Discount :IPromotion 13 { 14 15 public double GetPrice(double originPrice) 16 { 17 Console.WriteLine("打八折:"); 18 return originPrice * 0.8; 19 } 20 } 21 }
3、MoneyBack返现类
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace 策略模式 8 { 9 /* 10 返现策略类:满100返50的策略 11 */ 12 class MoneyBack :IPromotion 13 { 14 public double GetPrice(double originPrice) 15 { 16 Console.WriteLine("满100返50"); 17 return originPrice - (int)originPrice / 100 * 50; 18 } 19 } 20 }
4、策略上下文类
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace 策略模式 8 { 9 /* 10 策略上下文,为客户选择合适的策略 11 */ 12 public class PromotionContext 13 { 14 private IPromotion p = null; 15 16 public PromotionContext(IPromotion p) 17 { 18 this.p = p; 19 } 20 21 public double GetPrice(double originPrice) 22 { 23 // 默认策略 24 if (this.p == null) 25 { 26 this.p = new Discount(); 27 } 28 return this.p.GetPrice(originPrice); 29 } 30 31 /// <summary> 32 /// 更改策略的方法 33 /// </summary> 34 /// <param name="p"></param> 35 public void ChangePromotion(IPromotion p) 36 { 37 this.p = p; 38 } 39 } 40 }
5、主程序调用
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace 策略模式 8 { 9 class Program 10 { 11 static void Main(string[] args) 12 { 13 // 默认策略:打八折的策略 14 PromotionContext pc = new PromotionContext(null); 15 Console.WriteLine(pc.GetPrice(200)) ; 16 17 // 更改策略:满100返50的策略 18 pc.ChangePromotion(new MoneyBack()); 19 Console.WriteLine(pc.GetPrice(155.9)); 20 Console.ReadKey(); 21 } 22 } 23 }
代码连接地址:http://files.cnblogs.com/files/dotnet261010/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F.rar
转载于:https://www.cnblogs.com/dotnet261010/p/7355397.html
设计模式四:策略模式相关推荐
- 8.6 GOF设计模式四: 策略模式… Strategy Pattern
策略模式- Strategy Pattern 在POS系统中,有时需要实行价格优惠, 该如何处理? 对普通客户或新客户报全价 对老客户统一折扣5% 对大客户统一折扣10% 注:课件 ...
- Java设计模式之策略模式与状态模式
一.策略模式定义 定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们之间可以相互替换,策略模式可以在不影响客户端的情况下发生变化. 好了,定义看看就完了,我知道你很烦看定义. 二.策 ...
- 橘子学设计模式之策略模式
策略模式 1.简介 俗话说:条条大路通罗马.在很多情况下,实现某个目标的途径不止一条,例如我们在外出 旅游时可以选择多种不同的出行方式,如骑自行车.坐汽车.坐火车或者坐飞机,可根据实 际情况(目的地. ...
- 设计模式之策略模式+工厂模式+模板模式结合
设计模式之策略模式+模板模式 为什么总是学不好设计模式 从"登录功能"中发现问题. 首先我们简单的了解功能需求: 于是你开始干活了: 1.控制层代码如下,根据不同的登录方式调用不同 ...
- 换个姿势学设计模式:策略模式
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源:公众号「闻人的技术博客」 前言 前段时间,接到一个 ...
- 研磨设计模式之 策略模式--转
http://www.uml.org.cn/sjms/201009092.asp 研磨设计模式之 策略模式 2010-09-09 作者:云飞龙行 来源:云飞龙行的blog 先感谢众多朋友的支持 ...
- 设计模式:策略模式(Strategy)
定 义:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化, 不会影响到使用算法的客户. 示例:商场收银系统,实现正常收费.满300返100.打8折.......等不同收费 ...
- C++设计模式之策略模式(Strategy)
Strategy策略模式 作用:定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户. UML图: 代码实现 #include <iostream& ...
- python策略模式包含角色_详解Python设计模式之策略模式
虽然设计模式与语言无关,但这并不意味着每一个模式都能在每一门语言中使用.<设计模式:可复用面向对象软件的基础>一书中有 23 个模式,其中有 16 个在动态语言中"不见了,或者简 ...
- 一篇博客读懂设计模式之-----策略模式
设计模式之策略模式 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的对象 定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换. 主要解决:在有多种算法相似的情况下 ...
最新文章
- 总结 - 沉寂了大半年后的又一次
- 企业移动化诉求与开发者之间的矛盾
- .Net软件UI界面测试自动化--UIAutomation技术
- 练习五:整数顺序排列
- SAP Fiori Launchpad上的错误消息 - User Parameter /UI2/WD_TRKORR_CUST is not maintained
- python 语音播放_基于Python编写的语音播放软件
- 图书管理系统——运行及总结
- React 组件间传值的几种情形
- 十二月十六日鸿蒙,华为12月16日举行鸿蒙 2.0 手机开发者Beta活动,分享鸿蒙OS2.0设计理念...
- IIS 7.0与ASP.NET
- linux下grub的设置密码,grub设置密码
- Java多线程系列---“基础篇”08之 join()
- layedit-jfinal后台获取
- 一生必看的 100 幅世界名画
- js获取移动端屏幕高度和宽度等设备尺寸
- iOS问题记录 - Xcode 14安装低版本iOS模拟器
- 舒适区下的焦虑感和破局
- MACOS 打开 Pycharm2020 闪退解决方法
- 无人驾驶传感类型和传感信息处理方法
- 关于毕业设计的一些小总结
热门文章
- CodeForces 359D (数论+二分+ST算法)
- Form提交前,ajax校验,并阻止提交
- 为什么喜欢听钢琴+小提琴
- git tag和branch的区别
- 矩阵行列式的几何意义验证
- ubuntu16.04下面用sublime运行scala代码
- pycharm加速安装python包的速度
- OpenCV学习笔记九-Canny边缘检测
- JeePlus左树右表之 表单【右表】自动获取列表【左树 】中的id
- 是什么职位_为什么说,质量工程师岗位变成了 “寡妇职位”?