设计模式 - 策略模式Strategy
策略模式(Strategy):
定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户。
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace ConsoleApplication1 7 { 8 enum Coupon 9 { 10 NoCoupon, 11 Discount, 12 ReturnM 13 } 14 15 #region 16 17 abstract class CashSuper 18 { 19 public abstract double acceptCash(double money); 20 } 21 22 class CashNormal: CashSuper 23 { 24 public override double acceptCash(double money) 25 { 26 return money; 27 } 28 } 29 30 class CashRebate: CashSuper 31 { 32 private double rebate = 1d; 33 34 public CashRebate(double rebate) 35 { 36 this.rebate = rebate; 37 } 38 39 public override double acceptCash(double money) 40 { 41 return money * rebate; 42 } 43 } 44 45 class CashReturn : CashSuper 46 { 47 private double moneyCondition = 0.0; 48 private double moneyReturn = 0.0d; 49 50 public CashReturn(double moneyCondition, double moneyReturn) 51 { 52 this.moneyCondition = moneyCondition; 53 this.moneyReturn = moneyReturn; 54 } 55 56 public override double acceptCash(double money) 57 { 58 double result = money; 59 60 if(money > moneyCondition) 61 { 62 result = money - Math.Floor(money/moneyCondition) * moneyReturn; 63 } 64 65 return result; 66 } 67 } 68 69 #endregion 70 71 #region Strategy Context 72 73 // Factory Pattern and Strategy Pattern 74 class CashContext 75 { 76 private CashSuper cs = null; 77 78 public CashContext(Coupon cp) 79 { 80 switch(cp) 81 { 82 case Coupon.NoCoupon: 83 cs = new CashNormal(); 84 break; 85 case Coupon.Discount: 86 cs = new CashRebate(0.8); 87 break; 88 case Coupon.ReturnM: 89 cs = new CashReturn(300, 100); 90 break; 91 } 92 } 93 94 public double GetResult(double money) 95 { 96 return this.cs.acceptCash(money); 97 } 98 } 99 100 #endregion 101 102 class Program 103 { 104 static void Main(string[] args) 105 { 106 CashContext cs = new CashContext(Coupon.Discount); 107 double d1 = cs.GetResult(500); 108 109 cs = new CashContext(Coupon.ReturnM); 110 double d2 = cs.GetResult(700); 111 112 Console.ReadLine(); 113 } 114 } 115 }
以上实例中,在策略模式中使用了工厂模式,可见工厂模式并非只有建立一个工厂类的做法。
本示例中, 也可以用简单工厂模式去实现,不过它需要客户端认识两个类去完成;而使用策略模式,只需要认识一个Context类就可以了,耦合降低了。
策略模式封装了变化。模式策略就是用来封装算法的。但是在实践中,我们发现可以用它来封装几乎任何类型的规则,只要在分析过程中听到需要在不同时间应用不同的规则,就可以考虑使用策略模式处理这种变化的可能性。
在基本的策略模式中,选择所有具体实现的职责由客户端对象承担,并转给策略模式的Context对象,这本身并没有解除客户端选择判断的压力,而策略模式与简单工厂模式结合之后,选择具体的职责可以由Context来承担,这最大化的减轻了客户端的职责。
转载于:https://www.cnblogs.com/zzunstu/p/9289855.html
设计模式 - 策略模式Strategy相关推荐
- 设计模式-策略模式(Strategy)-Java
设计模式-策略模式(Strategy)-Java 目录 文章目录 1.前言 2.示例案例-电影票打折方案 3.策略模式概述 3.1.策略模式定义 3.2.策略模式结构 3.3.策略模式结构图中角色 3 ...
- 解读设计模式----策略模式(Strategy Pattern)
一.模式概述 策略模式(Strategy Pattern)在外形上与状态模式很相似,但在意图上有些不同.其意图是使这些算法可以相互替换,并提供一种方法来选择最合适的算法. 在我应 ...
- 设计模式--策略模式(strategy)
1.策略模式(strategy ['strætədʒi]) 我的理解是:方案候选模式 (反正关键就是有很多的候选,哈哈) 看了很多例子,都是在说鸭子的,那个例子很好,在这里可以看 他们生产鸭子,我们就 ...
- 李建忠设计模式——策略模式Strategy
目录 1.策略模式定义 1.动机 2.模式定义 3.结构 2.实现例子 1.问题描述 2.代码实现 3.要点总结 4.参考 1.策略模式定义 1.动机 软件构建过程中,某些对象使用的算法可能多种多样, ...
- 关于设计模式——策略模式-Strategy Pattern
文章目录 1 策略模式 1.1 模拟鸭子 1.2 设计原则 1.3 整合行为 1.4 模拟鸭子代码的代码 1.5 动态设定行为 1.6 重新查看整体 1.7 继承和组合 1.8 总结 1.9 优劣期间 ...
- 趣谈设计模式 | 策略模式(Strategy):你还在使用冗长的if-else吗?
文章目录 案例:指挥官AI 策略模式 配合工厂模式 总结 完整代码与文档 案例:指挥官AI 案例可能不符合实际逻辑,仅用于表述设计模式的思想,勿介意 假设我们开发了一款类似全面战争的即时战略游戏,为了 ...
- 设计模式 – 策略模式(Strategy)
2019独角兽企业重金招聘Python工程师标准>>> 实例:商店促销 (1)首先考虑用简单工厂模式进行设计 Ø 客户端代码Main.java package com.yilong ...
- 设计模式——策略模式( Strategy Pattern )
写代码超过千行,自定义类10个以上,往往写着写着就觉的乱,最终决定抽空补习下设计模式方面的知识.本来AS3出了本关于设计模式的书的,国人也翻译了.我同事也早早买了一本,但前些天我借来看了几页,翻译的太 ...
- Java设计模式-策略模式(Strategy)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.策略模式 二.策略模式示例代码 1.支付策略 2.具体支付策略实现 3.策略执行对象 4.测试 总结 前言 本篇介 ...
最新文章
- 用C++开发Web应用
- swift3.0三种反向传值
- The superclass javax.servlet.http.HttpServlet was not found 问题解决
- 直播 | AAAI 2021:文本对抗攻防中的对抗训练方法
- linux c语言 延迟,linux下写个C语言程序,要求有0.5微秒以下的延时,要怎样写
- 计算机管理员命令符怎么关机,详细教您电脑关机命令是什么
- Photoshop - CMYK 和 RGB 区别是什么?
- php多合一安装包,DOXCX多合一小程序系统Sass平台源码分享
- 不一样的国外广告联盟与cpa赚钱!
- Unable to start embedded Tomcat 解决方式(已解决)
- 河城荷取 二分答案 最大流
- dis的前缀单词有哪些_三个常见的前缀,re-,anti-,dis-,你知道它们的用法吗?
- PCM音频处理(1)——分离声道、以及声音处理
- lda主题模型的可视化_Gensim LDA主题模型实验
- atcoder abc242 c题 1111gal password
- 通过ZPL指令调用zebra打印机打印面单(java版)
- 登录中国专利电子申请网的正确姿势
- Tesseract OCR 下载及安装教程 (中英文语言包)
- 记一次电信宽带 接k2p a2刷 openwrt ipv6无法使用问题
- 如何对数字货币进行投资分析--基本面
热门文章
- 【python零基础入门学习】Python入门,带你快速学习Python 基础语法
- 【OpenCV】OpenCV函数精讲之 -- 颜色空间缩减及LUT函数
- CVPR2019 oral 目标跟踪算法之SiamRPN++
- 前沿 | NVIDIA PyTorch库让3D深度学习研究更简单!
- OpenCV人脸识别之三:识别自己的脸
- 机器学习实战 | 数据探索(变量变换、生成)
- c语言调用机器码,演示几种用C语言来执行shellcode(其实也就是机器码)的方式
- 小程序和android联调,小程序打开APP指定页面
- java控制台输出五行字符串_java五行代码导出Excel
- 2019年网络规划设计师上午真题及答案解析