[.net 面向对象程序设计深入](26)实战设计模式——策略模式 Strategy (行为型)

1,策略模式定义

策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

策略模式的组成:

—抽象策略角色: 策略类,通常由一个接口或者抽象类实现。 
—具体策略角色:包装了相关的算法和行为。 
—环境角色:持有一个策略类的引用,最终给客户端调用。 

2,策略模式适场景

(1)多个相关的类中,仅行为不同,即一个系统中需要在几个不同的算法中选择时。比如中出行中,我们选择交通方式火车、飞机、自行车、汽车等。

(2)一个算法的不同变体时。比如一个收取暖费的算法,不同的收费方式如按房屋面积、按供热焦耳量、按面积和热量混合法等 。

(3)不想暴露算法给使用者。比如,有一个复杂算法或算法中有相对应的数据结构不想让使用者知道。

(4)一个行为中有多个条件时。比如,有多个条件语句,而且实现比较复杂或比较长时,使用策略模式,除了结构清晰外,维护某一分支也比较方便。

3,策略模式优点

(1)抽象策略类和具体策略角色为环境类定义了一系列可以重用的算法或行为,并且继承有助于取出共用部分的算法。

(2)提供了可以替换继承关系的办法。可以创建一个环境类的子类,里面封装不同的行为,通过环境类来驱动策略。但这样也会导致环境类中的行为包含了具体实现,使用程序难以理解,难以维护。

(3)消除了复杂的IF..ELSE。含有许多复杂条件语句的代码可以使用策略模式来使逻辑更加清晰,易于维护。

(4)实了具有相同类型的多个行业的切换。让用户在多个策略中切换行为。

4,策略模式缺点

(1)需要事先知道所有策略类行为有何不同,才能让用户很好的选择。容易向使用者暴露策略中的各个行为。

(2)环境类和策略类之间产生通信开销。

(3)需要创建很多策略类。后面会说到享元模式,一定程度上减少类。

5,策略模式应用

(1)华山论剑

还是以熟悉的华山论剑为例,比赛方式(也就是三个具体策略类)有“比外功、比内功、比招式”,场景为“华山”(也就是场景类HuaShan),开始比赛了,主持人事先知道这几种比赛方式(也就是具体策略类),主持人(也就是具体使用者)让依次以这几种方式进行。

先看一下UML类图(在VS中使用类图,可以参考我前面的文章:在Visual Studio 2013/2015中设计UML类图)

下面是具体代码:

抽象策略类 LunJian

public abstract class LunJian
{public abstract void BiSai();
}

具体策略类 WaiGong NeiGong ZhaoShi

public class WaiGong : LunJian
{public override void BiSai(){Console.WriteLine("外功比试开始了!");}
}

public class NeiGong : LunJian
{public override void BiSai(){    Console.WriteLine("内功比试开始了!");}
}

public class ZhaoShi : LunJian
{public override void BiSai(){Console.WriteLine("招式比试开始了!");}
}

场景类(也就是策略上下文 ) HuaShan

public class HuaShan
{LunJian lunJian=null;public void SetLunJian(LunJian lunJian){this.lunJian = lunJian;}public void BiShi(){this.lunJian.BiSai();}
}

使用者,就是控制台应用程序

class Program{static void Main(string[] args){HuaShan huanShan = new HuaShan();huanShan.SetLunJian(new WaiGong());huanShan.BiShi();huanShan.SetLunJian(new NeiGong());huanShan.BiShi();huanShan.SetLunJian(new ZhaoShi());huanShan.BiShi();Console.ReadLine();}}

依次给出三种比试方式策略,运行结果如下:

(2)华山论剑升级版

上面的示例比较简单,假如我们比试开始的时候,还需要点名两个比赛选手,这就需要在具体策略类的方法中增加参数。我们增加BiShi()方法参数,改进后代码如下:

抽象策略类 LunJian

public abstract class LunJian
{public abstract void BiSai(string player1,string player2);}

具体策略类 WaiGong NeiGong ZhaoShi

public class WaiGong : LunJian
{public override void BiSai(string player1,string player2){Console.WriteLine("外功比试开始了!"+string.Format(" {0} 和 {1} 出场",player1,player2));}
}

public class NeiGong : LunJian
{public override void BiSai(string player1, string player2){    Console.WriteLine("内功比试开始了!" + string.Format(" {0} 和 {1} 出场", player1, player2));}
}

public class ZhaoShi : LunJian
{public override void BiSai(string player1, string player2){Console.WriteLine("招式比试开始了!" + string.Format(" {0} 和 {1} 出场", player1, player2));}
}

场景类(也就是策略上下文 ) HuaShan

public class HuaShan
{LunJian lunJian=null;public void SetLunJian(LunJian lunJian){this.lunJian = lunJian;}public void BiShi(string player1,string player2){this.lunJian.BiSai(player1,player2);}
}

使用者,就是控制台应用程序

    class Program{static void Main(string[] args){HuaShan huanShan = new HuaShan();huanShan.SetLunJian(new WaiGong());huanShan.BiShi("黄药师","欧阳锋");huanShan.SetLunJian(new NeiGong());huanShan.BiShi("洪七公","一灯大师");huanShan.SetLunJian(new ZhaoShi());huanShan.BiShi("欧阳锋","洪七公");Console.ReadLine();}}

运行结果:

华山论剑的业务肯定比这个要复杂,上面的出场人不同,比赛方式不同,甚至还其他不同的规则出现。

如果我们不使用策略模式,而通过传统的if...else来写,不但要写很长的代码,还需要条件语句多次嵌套。

最主要的是代码的可读性较差,而且难以再解。

6,总结

(1)策略模式是一个比较容易理解和使用的设计模式,策略模式是对算法的封装,它把算法的责任和算法本身分割开,委派给不同的对象管理。策略模式通常把一个系列的算法封装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是“准备一组算法,并将每一个算法封装起来,使得它们可以互换”。
(2)在策略模式中,应当由客户端自己决定在什么情况下使用什么具体策略角色。
(3)策略模式仅仅封装算法,提供新算法插入到已有系统中,以及老算法从系统中“退休”的方便,策略模式并不决定在何时使用何种算法,算法的选择由客户端来决定。这在一定程度上提高了系统的灵活性,但是客户端需要理解所有具体策略类之间的区别,以便选择合适的算法,这也是策略模式的缺点之一,在一定程度上增加了客户端的使用难度。

7.实例源代码

https://github.com/yubinfeng/BlogExamples.git

==============================================================================================

返回目录

<如果对你有帮助,记得点一下推荐哦,如有有不明白或错误之处,请多交流>

<对本系列文章阅读有困难的朋友,请先看 《.net 面向对象编程基础》 和 《.net 面向对象程序设计进阶》 >

<转载声明:技术需要共享精神,欢迎转载本博客中的文章,但请注明版权及URL>

.NET 技术交流群:467189533

==============================================================================================

转载于:https://www.cnblogs.com/yubinfeng/p/6534805.html

[.net 面向对象程序设计深入](26)实战设计模式——策略模式 Strategy (行为型)...相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

  7. 设计模式 - 策略模式Strategy

    策略模式(Strategy): 定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户. 1 using System; 2 using System.Co ...

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

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

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

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

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

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

最新文章

  1. Android手机指令操作释疑
  2. QQ目录里哪个文件是记录系统消息的?
  3. pycharm matplotlib.pyplot.figure().add_subplot()绘制三维图时报错:ValueError: Unknown projection 3d(bug)
  4. linux内核杂记(10)-进程调度(5)
  5. 米家扫拖一体机器人重置键_全面升级——米家扫拖机器人1T体验
  6. .Net中XML,JSON的几种处理方式
  7. MySQL 如何查找并删除重复行
  8. [转]网店博客营销之微博实战技巧:还没有做微博的掌柜看过来
  9. 24点游戏 C语言代码
  10. win7设置网络共享(ICS共享)
  11. Python开源Devops定时任务管理系统(含定时调用接口、定时ssh远程执行命令)
  12. vue3状态管理pinia、 路由useRouter
  13. 美亚杯第二届(2016)-个人赛
  14. CAD二次开发 对象
  15. 错误: 找不到符号 符号: 方法 getResources() 位置: 类型为String的变量 dataSex
  16. 七星彩长奖表图_新版够力七星彩奖表
  17. 税控盘签名认证服务器状态,不用插税盘,也可以勾选认证发票、确认签名了 !...
  18. Web网页设计之HTML_5. HTML 表格
  19. SVM解释:五、SMO算法
  20. Django 搭建博客网站-task02:快速搭建网站

热门文章

  1. 译文-Minor GC vs Major GC vs Full GC
  2. 源码nginx+php
  3. CSS选择器、优先级与匹配原理
  4. 携程状告去哪儿一案有猫腻
  5. 熔断与降级 搜索和学习 了解不深
  6. 微博每日数十亿级业务下的计数器如何扩展Redis?
  7. Go语言构建高并发分布式系统实践
  8. 技术出身要创业,容易吗?
  9. 有了这个开源项目,再也不会忘记 Linux 命令啦~
  10. 搞副业,你离不开这个工具!