策略模式(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相关推荐

  1. 设计模式-策略模式(Strategy)-Java

    设计模式-策略模式(Strategy)-Java 目录 文章目录 1.前言 2.示例案例-电影票打折方案 3.策略模式概述 3.1.策略模式定义 3.2.策略模式结构 3.3.策略模式结构图中角色 3 ...

  2. 解读设计模式----策略模式(Strategy Pattern)

    一.模式概述      策略模式(Strategy Pattern)在外形上与状态模式很相似,但在意图上有些不同.其意图是使这些算法可以相互替换,并提供一种方法来选择最合适的算法.       在我应 ...

  3. 设计模式--策略模式(strategy)

    1.策略模式(strategy ['strætədʒi]) 我的理解是:方案候选模式 (反正关键就是有很多的候选,哈哈) 看了很多例子,都是在说鸭子的,那个例子很好,在这里可以看 他们生产鸭子,我们就 ...

  4. 李建忠设计模式——策略模式Strategy

    目录 1.策略模式定义 1.动机 2.模式定义 3.结构 2.实现例子 1.问题描述 2.代码实现 3.要点总结 4.参考 1.策略模式定义 1.动机 软件构建过程中,某些对象使用的算法可能多种多样, ...

  5. 关于设计模式——策略模式-Strategy Pattern

    文章目录 1 策略模式 1.1 模拟鸭子 1.2 设计原则 1.3 整合行为 1.4 模拟鸭子代码的代码 1.5 动态设定行为 1.6 重新查看整体 1.7 继承和组合 1.8 总结 1.9 优劣期间 ...

  6. 趣谈设计模式 | 策略模式(Strategy):你还在使用冗长的if-else吗?

    文章目录 案例:指挥官AI 策略模式 配合工厂模式 总结 完整代码与文档 案例:指挥官AI 案例可能不符合实际逻辑,仅用于表述设计模式的思想,勿介意 假设我们开发了一款类似全面战争的即时战略游戏,为了 ...

  7. 设计模式 – 策略模式(Strategy)

    2019独角兽企业重金招聘Python工程师标准>>> 实例:商店促销 (1)首先考虑用简单工厂模式进行设计 Ø  客户端代码Main.java package com.yilong ...

  8. 设计模式——策略模式( Strategy Pattern )

    写代码超过千行,自定义类10个以上,往往写着写着就觉的乱,最终决定抽空补习下设计模式方面的知识.本来AS3出了本关于设计模式的书的,国人也翻译了.我同事也早早买了一本,但前些天我借来看了几页,翻译的太 ...

  9. Java设计模式-策略模式(Strategy)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.策略模式 二.策略模式示例代码 1.支付策略 2.具体支付策略实现 3.策略执行对象 4.测试 总结 前言 本篇介 ...

最新文章

  1. 用C++开发Web应用
  2. swift3.0三种反向传值
  3. The superclass javax.servlet.http.HttpServlet was not found 问题解决
  4. 直播 | AAAI 2021:文本对抗攻防中的对抗训练方法
  5. linux c语言 延迟,linux下写个C语言程序,要求有0.5微秒以下的延时,要怎样写
  6. 计算机管理员命令符怎么关机,详细教您电脑关机命令是什么
  7. Photoshop - CMYK 和 RGB 区别是什么?
  8. php多合一安装包,DOXCX多合一小程序系统Sass平台源码分享
  9. 不一样的国外广告联盟与cpa赚钱!
  10. Unable to start embedded Tomcat 解决方式(已解决)
  11. 河城荷取 二分答案 最大流
  12. dis的前缀单词有哪些_三个常见的前缀,re-,anti-,dis-,你知道它们的用法吗?
  13. PCM音频处理(1)——分离声道、以及声音处理
  14. lda主题模型的可视化_Gensim LDA主题模型实验
  15. atcoder abc242 c题 1111gal password
  16. 通过ZPL指令调用zebra打印机打印面单(java版)
  17. 登录中国专利电子申请网的正确姿势
  18. Tesseract OCR 下载及安装教程 (中英文语言包)
  19. 记一次电信宽带 接k2p a2刷 openwrt ipv6无法使用问题
  20. 如何对数字货币进行投资分析--基本面

热门文章

  1. 【python零基础入门学习】Python入门,带你快速学习Python 基础语法
  2. 【OpenCV】OpenCV函数精讲之 -- 颜色空间缩减及LUT函数
  3. CVPR2019 oral 目标跟踪算法之SiamRPN++
  4. 前沿 | NVIDIA PyTorch库让3D深度学习研究更简单!
  5. OpenCV人脸识别之三:识别自己的脸
  6. 机器学习实战 | 数据探索(变量变换、生成)
  7. c语言调用机器码,演示几种用C语言来执行shellcode(其实也就是机器码)的方式
  8. 小程序和android联调,小程序打开APP指定页面
  9. java控制台输出五行字符串_java五行代码导出Excel
  10. 2019年网络规划设计师上午真题及答案解析