马上加入IBC程序猿 各种源码随意下,各种教程随便看! 注册 每日签到 加入编程讨论群

C#教程 ASP.NET教程 C#视频教程程序源码享受不尽 C#技术求助 ASP.NET技术求助

【源码下载】 社群合作 申请版主 程序开发 【远程协助】 每天乐一乐 每日签到 【承接外包项目】 面试-葵花宝典下载

官方一群:

官方二群:

通俗易懂设计模式解析——策略模式

[复制链接]
查看2198 | 回复1 | 2019-10-17 09:43:23 | 显示全部楼层 |阅读模式

前言

  本日我们来看计谋模式【Stragety Pattern【活动型】】,这个模式还是比力好明确的。计谋怎么明确呢?一样平常是指:1. 可以实现目标的方案聚集;2. 根据形势发展而订定的举措方针和斗争方法;3. 有斗争艺术,能注意方式方法。总的来说呢就是针对一个目标的不同的方法聚集。这里要讲的计谋模式怎么明确呢?简朴的说就是对于一个类的活动大概其算法可以在运行时更改更换。

计谋模式介绍

一、来由

  在软件体系中,一些对象使用的算法大概活动大概会经常变革,假如把这些变革的算法写到对象中的话,会使对象变得较为复杂、不易明确。那么我们怎样在运行时动态的修改对象的不同的算法呢?这就使用到了计谋模式。

二、意图

  界说一系列的算法,把它们一个个封装起来, 而且使它们可相互更换。

三、案例图

094323gxgjg6bzc6bh6hj6.png

四、计谋模式代码示例

  看上面的案例图好像和上一篇状态模式的案例图有点相似。都是包含的三个部门。具体区别我们看后面的具体介绍。

情况脚色:包含持有一个Strategy抽象计谋的引用。

抽象计谋:界说一个公共方法,由其具体计谋去实现不同算法。

具体计谋:实现抽象计谋接口方法。

  这里我们看这么一个案例,在一个超市买东西。最后结算的时间都会问是否有会员,结算机制就有以下几种。平常用户全额盘算。平常会员打95折。黄金会员打9折。钻石会员打8折。我们看下怎样实现这一功能:

  1. namespace Stragety_Pattern
  2. {
  3. class StragetyPattern
  4. {
  5. }
  6. #region 抽象计谋==================
  7. /// <summary>
  8. /// 抽象计谋接口
  9. /// </summary>
  10. public interface IStragetyPattern
  11. {
  12. /// <summary>
  13. /// 结算接口
  14. /// </summary>
  15. void Settlement(decimal Money);
  16. }
  17. #endregion
  18. #region 具体计谋=======================
  19. /// <summary>
  20. /// 无会员盘算方式
  21. /// </summary>
  22. public class OrdinaryStragety : IStragetyPattern
  23. {
  24. public void Settlement(decimal Money)
  25. {
  26. Console.WriteLine($"不是会员,不举行扣头结算。应付款{Money}");
  27. }
  28. }
  29. /// <summary>
  30. /// 平常会员盘算方式
  31. /// </summary>
  32. public class MemberStragety : IStragetyPattern
  33. {
  34. public void Settlement(decimal Money)
  35. {
  36. Console.WriteLine($"平常会员,打95折结算。应付款{Money*0.9M}");
  37. }
  38. }
  39. /// <summary>
  40. /// 黄金会员盘算方式
  41. /// </summary>
  42. public class GoldMemberStragety : IStragetyPattern
  43. {
  44. public void Settlement(decimal Money)
  45. {
  46. Console.WriteLine($"黄金会员,打9折结算。应付款{Money*0.95M}");
  47. }
  48. }
  49. /// <summary>
  50. /// 钻石会员盘算方式
  51. /// </summary>
  52. public class DiamondGoldMemberStragety : IStragetyPattern
  53. {
  54. public void Settlement(decimal Money)
  55. {
  56. Console.WriteLine($"钻石会员,打8折结算。应付款{Money*0.8M}");
  57. }
  58. }
  59. #endregion
  60. #region 情况脚色
  61. public class ContextStragety
  62. {
  63. private IStragetyPattern _stragety;
  64. public ContextStragety(IStragetyPattern stragety)
  65. {
  66. _stragety = stragety;
  67. }
  68. /// <summary>
  69. /// 调用结算方法
  70. /// </summary>
  71. /// <param name="Money"></param>
  72. public void GetSettlement(decimal Money)
  73. {
  74. _stragety.Settlement( Money);
  75. }
  76. }
  77. #endregion
  78. }
复制代码

  1. namespace Stragety_Pattern
  2. {
  3. class Program
  4. {
  5. static void Main(string[] args)
  6. {
  7. decimal Account = 190.99M;
  8. ///会员盘算
  9. ContextStragety stragety = new ContextStragety(new MemberStragety());
  10. stragety.GetSettlement(Account);
  11. ///平常结算
  12. stragety = new ContextStragety(new OrdinaryStragety());
  13. stragety.GetSettlement(Account);
  14. }
  15. }
  16. }
复制代码

094324gdoa06g13v0536xz.png

  这里我们针对最后结算的金额举行盘算的时间是可以相互更换的。由于在具体计谋中,都把算法的变革封装了起来。

使用场景及优缺点

一、使用场景

1、假如在体系中有一些类,他们之间的区别就在于其活动的话。可以使用计谋模式让一个对象在许多的活动中动态的选择一种活动。

2、一个体系中需要在多种算法中选择一种。

3、假如一个对象有许多的活动的话,可以简化其多重条件选择语句。制止难于维护的题目。

二、优点

1、计谋类之间可以自由切换,由于计谋类中都是实现的抽象计谋的一个方法。以是可以自由切换。

2、易于扩展,在我们新增计谋的时间根本上不需要修改之前的代码。

3、对多重条件选择语句举行优化简化

三、缺点

1、随着计谋增多,计谋类会随之增长。

2、客户端必须知道所有的计谋类,而且自行决定使用哪一种计谋。

总结

  到这里计谋模式就介绍完了。计谋模式紧张是针对的有一系列算法。并把他们都封装起来。他们之间可以自由切换。使这些算法的变革独立于客户端的变革。也就是把多种活动之间的变革分别举行封装起来。然后在我们调用的时间可以自由的举行切换调用。

  这里我们在开篇有提到计谋模式的案例图和状态模式的有点相似。这里我们重点分析一些计谋模式和状态模式之间的区别吧:

1、情况脚色中的使命有所不同,计谋模式的情况脚色中具有一种委托作用,负责根据传进来的计谋调用其算法。但是状态模式中的情况脚色不但负责这活动方法的调用,还负责有记录状态变革、与具体的状态类协作。完成状态切换之后活动的切换。

2、计谋模式紧张管理的题目是将内部的算法的改变对外部的影响降低。包管算法的自由切换。状态模式紧张管理的是状态的改变引起活动的变革、一个对象状态改变,从外界看来就好像是活动改变。

3、计谋模式是一个算法的封装。这里封装的一个算法可以是故意义的对象,也可以是没故意义的逻辑片断。例如这里封装加密算法。各种加密算法,可以自由切换。算法必须是平行的。状态模式是要求一些列的状态变革随着有着活动的变革。要求拥有状态和活动。


即使受伤了,也要抬起头微笑着说,本日气候真好。

  C#设计模式系列目录

   接待各人扫描下方二维码,和我一起踏上设计模式的闯关之路吧!

  

094324r8gud4qf78dzdcqb.jpg







来源:https://www.cnblogs.com/hulizhong/p/11678188.html
C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则