最近在看"Head First 设计模式"这本书,便想将自己所学的记录下来以加深理解,文中肯定有许多不足之处,请各位前辈们指出.

什么是设计模式

设计模式并不是某种开发语言中的工具,而是我们处理问题时的一种体现,平时在工作我们也总是会使用设计模式,在工作时我们会碰到各种问题,然后我们通过思考,总结.得到出自己的一套处理问题的经验,或许我们并不知道什么是设计模式,但是对于某种问题我们已经有了一套解决方案,然后通过观看它人的代码会发现别人处理这类问题与自己总结的相同,其实设计模式就是如此,它是前辈们通过大量的经验总结了出了一套程序设计思想,然后通过记录和分享,于是出现了现在编程中的圣经-----23种设计模式.也就是说设计模式其实并不神秘,但是它却如此的重要

:此处所说的问题是代码中设计的问题,并不是功能需求问题,例如代码的紧耦合

策略模式介绍

下面来说一下第一个设计模式:策略模式,策略模式是一个极其简单的模式,但也是一个极其常用的模式,下面以一个极其简单的例子介绍策略模式
现在要为一家商场设计一个促销功能,不过现在并不知道具体的促销需求,我们只需将促销需求设计出来,然后在后期进行添加具体的促销策略,于是我们快速的完成了这个类的第一版

// 商品类
class Goods
{// 商品名称public string GoodsName { get; set; }// 商品价格public decimal GoodsPrice { get; set; }// 促销方法public void Discount(){Console.WriteLine("这是促销方法,目前无促销");}
}   

注:这是一个简单例子,只为阐述策略模式.

这一个简单的类型便是第一版的商品类的促销功能,但是在这里有一个巨大的问题,就是促销策略的改变使得我们就必须更改其代码.这并符合我们的设计理念,我们观察代码可以得知在这个功能中促销是一个可变的部分,而我们可以将可变的部分进行分离,现在我们来更改一下代码

    // 商品类class Goods{//促销类引用public DiscountStrategyClass DiscountStrategyClass { get; set; }// 商品名称public string GoodsName { get; set; }// 商品价格public decimal GoodsPrice { get; set; }// 促销方法public void Discount(){//调用促销类的促销方法DiscountStrategyClass.Discount();//Console.WriteLine("这是促销方法,目前无促销");}}// 促销类class DiscountStrategyClass{// 促销方法public void Discount(){Console.WriteLine("这是促销方法,目前无促销");}}

上面就是我们将促销方法分离后的代码,我创建了一个促销类,然后在商品类内部创建一个促销类的引用并在促销方法调用促销类的促销方法,然后我们其实很自然的就能想到下一步了,也就是创建抽象促销类,然后子类进行实现,并约定好自己的促销策略,而商品类只需声明并调用抽象促销类促销方法就可以,

    // 商品类class Goods{//促销接口引用public IDiscountStrategy DiscountStrategy { get; set; }// 商品名称public string GoodsName { get; set; }// 商品价格public decimal GoodsPrice { get; set; }// 促销方法public void Discount(){//调用促销类的促销方法DiscountStrategy.Discount();//Console.WriteLine("这是促销方法,目前无促销");}}// 促销类interface IDiscountStrategy{// 定义促销方法void Discount();}//八折折扣class EightyPercentDS : IDiscountStrategy{public void Discount(){Console.WriteLine("这是促销方法,我打八折");}}//七折折扣class SevenPercentDS : IDiscountStrategy{public void Discount(){Console.WriteLine("这是促销方法,我打八折");}}

这个小的促销功能就完成了,并且我们可以感觉到在写代码时总是这样使用
从这里可以看到策略模式的两个好处

  1. 可以在不改变当前结构下添加新的策略
  2. 可以在运行时动态的改变策略

策略模式体现了两个原则:

  1. 找出程序中可能需要变化的地方,把它独立出来,好让其它部分不会受到它的影响
  2. 多用组合,少用继承

其中策略模式强调的是组合,也就是有一个(HAS-A),只是这里并没有很好的体现,在装饰者模式更能很好的体现
我们在设计编写代码时也要遵守这样的规则,让系统变得更有弹性.

策略模式结构

UML

下面是这个简单的策略模式的UML图

但在项目中有时候却会再抽象一层,将环境角色类(当前Goods)抽象成抽象类也就是这样的UML图

这样的UML可以想象成将Goods类变成抽象类,然后再声明它的子类,例如ComputerGoods(电视),BookGoods(书籍),然后利用继承的特性来解放实现,也就是我们常说的面对接口编程

注: 面对接口编程并不是面对Interface编程,而是面对超类编程

策略模式定义

定义一个算法家族,分别封装起来,让它们可以互相替换,此模式让算法的变化独立于使用算法的客户

转载于:https://www.cnblogs.com/yan7/p/9787946.html

设计模式学习---策略模式相关推荐

  1. swift设计模式学习 - 策略模式

    移动端访问不佳,请访问我的个人博客 设计模式学习的demo地址,欢迎大家学习交流 策略模式 策略模式定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户. ...

  2. 设计模式学习--策略模式

    前言 使用策略模式可以代替多重if-else和switch语句,让代码维护变得更加简单,乍一看跟工厂模式一模一样,下面是个简单的例子.策略模式包含以下三种角色: 环境(Context)角色:持有一个S ...

  3. JavaScript设计模式之策略模式(学习笔记)

    在网上搜索"为什么MVC不是一种设计模式呢?"其中有解答:MVC其实是三个经典设计模式的演变:观察者模式(Observer).策略模式(Strategy).组合模式(Composi ...

  4. 换个姿势学设计模式:策略模式

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源:公众号「闻人的技术博客」 前言 前段时间,接到一个 ...

  5. 策略设计模式_设计模式之策略模式总结

    再上一篇文章<设计模式之策略模式>中,我们通过模拟鸭子项目,了解了什么是策略模式,怎么使用策略模式.本文将通过鸭子项目的学习,对策略模式进行总结. 策略模式: 分别封装行为接口,实现算法族 ...

  6. 揭秘设计模式:策略模式(Strategy)的枚举(Enum)实现

    2019独角兽企业重金招聘Python工程师标准>>> 链接地址:http://www.xx566.com/detail/120.html 上一篇:揭秘设计模式:策略模式(Strat ...

  7. 设计模式之策略模式+工厂模式+模板模式结合

    设计模式之策略模式+模板模式 为什么总是学不好设计模式 从"登录功能"中发现问题. 首先我们简单的了解功能需求: 于是你开始干活了: 1.控制层代码如下,根据不同的登录方式调用不同 ...

  8. 设计模式之策略模式(Java 实现)

    设计模式之策略模式(Java 实现) 大家一定都使用过电子地图.在地图中输入出发地和目的地,然后再选取你的出行方式,就可以计算出最优线路以及预估的时长.出行方式有驾车.公交.步行.骑行等.出行方式不同 ...

  9. Java设计模式之策略模式与状态模式

    一.策略模式定义 定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们之间可以相互替换,策略模式可以在不影响客户端的情况下发生变化. 好了,定义看看就完了,我知道你很烦看定义. 二.策 ...

最新文章

  1. 看一名 KDE 开发者如何使用 C++17 为项目提升巨大速度
  2. matlab二阶差分函数,实验5图像分割
  3. go语言中的闭包结构
  4. 开源项目葫芦藤:IdentityServer4的实现及其运用
  5. 初学 Ajax(涉及 php)
  6. _报告指出:黑客已将攻击的目标逐渐迁移到 Linux 服务器和工作站上
  7. mysql误删除ibdata1以及日志ib_logfile*
  8. php将汉字转换为拼音和得到词语首字母(一)
  9. 梦幻群侠传5帮派修炼_梦幻群侠传5唯美版
  10. 9.携程架构实践 --- 网站高可用
  11. mysql的update和case when同步使用
  12. Python游戏篇:细节之大型游戏爆炸效果(附代码)
  13. 打造你自己的 MAME 模拟器。
  14. 互联网中的裂变是什么?
  15. c语言字符数组讲课PPT,C语言数组应用与字符串.ppt
  16. 初识中间件Kafka
  17. [Eigen]Eigen的单位矩阵C++
  18. Tensorflow2.0---SSD网络原理及代码解析(二)-锚点框的生成
  19. IP地址分类及子网划分
  20. ArcGIS拓扑面错误批量修改

热门文章

  1. 透彻理解块级元素的宽度
  2. Python 面向对象-如何查看类的父类,外部如何获取类的名字
  3. HTML areamap标签及在实际开发中的应用
  4. 在cmd环境下操作Oracle11g数据库
  5. 长度限制的队列Python
  6. 生成树(光棍 牛客, 思维)
  7. Python3 JSON处理
  8. 『TensorFlow』专题汇总
  9. scrapy-1.2.1安装失败之解决方法
  10. Palindrome Partitioning