ibcadmin 发表于 2019-10-17 09:43:23

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

<h2><strong>前言</strong></h2>
<p>  本日我们来看计谋模式【Stragety Pattern【活动型】】,这个模式还是比力好明确的。计谋怎么明确呢?一样平常是指:1. 可以实现目标的方案聚集;2. 根据形势发展而订定的举措方针和斗争方法;3. 有斗争艺术,能注意方式方法。总的来说呢就是针对一个目标的不同的方法聚集。这里要讲的计谋模式怎么明确呢?简朴的说就是对于一个类的活动大概其算法可以在运行时更改更换。</p>
<h2><strong>计谋模式介绍</strong></h2>
<h3 style="margin-left: 30px;">一、<strong>来由</strong></h3>
<p style="margin-left: 30px;">  在软件体系中,一些对象使用的算法大概活动大概会经常变革,假如把这些变革的算法写到对象中的话,会使对象变得较为复杂、不易明确。那么我们怎样在运行时动态的修改对象的不同的算法呢?这就使用到了计谋模式。</p>
<h3 style="margin-left: 30px;">二、<strong>意图</strong></h3>
<p style="margin-left: 30px;"><strong>  界说一系列的算法,把它们一个个封装起来, 而且使它们可相互更换。</strong></p>
<h3 style="margin-left: 30px;">三、<strong>案例图</strong></h3>
<p> <div align="center"></div></p>
<h3 style="margin-left: 30px;">四、<strong>计谋模式代码示例</strong></h3>
<p style="margin-left: 30px;">  看上面的案例图好像和上一篇状态模式的案例图有点相似。都是包含的三个部门。具体区别我们看后面的具体介绍。</p>
<p style="margin-left: 90px;"><strong>情况脚色:包含持有一个Strategy抽象计谋的引用。</strong></p>
<p style="margin-left: 90px;"><strong>抽象计谋:界说一个公共方法,由其具体计谋去实现不同算法。</strong></p>
<p style="margin-left: 90px;"><strong>具体计谋:实现抽象计谋接口方法。</strong></p>
<p style="margin-left: 30px;">  这里我们看这么一个案例,在一个超市买东西。最后结算的时间都会问是否有会员,结算机制就有以下几种。平常用户全额盘算。平常会员打95折。黄金会员打9折。钻石会员打8折。我们看下怎样实现这一功能:</p>
<p> </p>

namespace Stragety_Pattern
{
    class StragetyPattern
    {
    }
    #region   抽象计谋==================
    /// <summary>
    /// 抽象计谋接口
    /// </summary>
    public interface IStragetyPattern
    {
      /// <summary>
      /// 结算接口
      /// </summary>
      void Settlement(decimalMoney);
    }
    #endregion

    #region   具体计谋=======================
    /// <summary>
    /// 无会员盘算方式
    /// </summary>
    public class OrdinaryStragety : IStragetyPattern
    {
      public void Settlement(decimalMoney)
      {
            Console.WriteLine($"不是会员,不举行扣头结算。应付款{Money}");
      }
    }

    /// <summary>
    ///平常会员盘算方式
    /// </summary>
    public class MemberStragety : IStragetyPattern
    {
      public void Settlement(decimalMoney)
      {
            Console.WriteLine($"平常会员,打95折结算。应付款{Money*0.9M}");
      }
    }

    /// <summary>
    /// 黄金会员盘算方式
    /// </summary>
    public class GoldMemberStragety : IStragetyPattern
    {
      public void Settlement(decimalMoney)
      {
            Console.WriteLine($"黄金会员,打9折结算。应付款{Money*0.95M}");
      }
    }

    /// <summary>
    /// 钻石会员盘算方式
    /// </summary>
    public class DiamondGoldMemberStragety : IStragetyPattern
    {
      public void Settlement(decimalMoney)
      {
            Console.WriteLine($"钻石会员,打8折结算。应付款{Money*0.8M}");
      }
    }
    #endregion

    #region   情况脚色
    public class ContextStragety
    {
      private IStragetyPattern _stragety;
      public ContextStragety(IStragetyPattern stragety)
      {
            _stragety = stragety;
      }

      /// <summary>
      /// 调用结算方法
      /// </summary>
      /// <param name="Money"></param>
      public void GetSettlement(decimalMoney)
      {
            _stragety.Settlement( Money);
      }
    }
    #endregion
}

<p> </p>

namespace Stragety_Pattern
{
    class Program
    {
      static void Main(string[] args)
      {
            decimal Account = 190.99M;
            ///会员盘算
            ContextStragety stragety = new ContextStragety(new MemberStragety());
            stragety.GetSettlement(Account);

            ///平常结算
             stragety = new ContextStragety(new OrdinaryStragety());
            stragety.GetSettlement(Account);
      }
    }
}

<p><div align="center"></div></p>
<p style="margin-left: 30px;">  这里我们针对最后结算的金额举行盘算的时间是可以相互更换的。由于在具体计谋中,都把算法的变革封装了起来。</p>
<h2><strong> 使用场景及优缺点</strong></h2>
<h3 style="margin-left: 30px;">一、<strong>使用场景</strong></h3>
<p style="margin-left: 60px;"><strong>1、假如在体系中有一些类,他们之间的区别就在于其活动的话。可以使用计谋模式让一个对象在许多的活动中动态的选择一种活动。</strong></p>
<p style="margin-left: 60px;"><strong>2、一个体系中需要在多种算法中选择一种。</strong></p>
<p style="margin-left: 60px;"><strong>3、假如一个对象有许多的活动的话,可以简化其多重条件选择语句。制止难于维护的题目。</strong></p>
<h3 style="margin-left: 30px;">二、<strong>优点</strong></h3>
<p style="margin-left: 60px;"><strong>1、计谋类之间可以自由切换,由于计谋类中都是实现的抽象计谋的一个方法。以是可以自由切换。</strong></p>
<p style="margin-left: 60px;"><strong>2、易于扩展,在我们新增计谋的时间根本上不需要修改之前的代码。</strong></p>
<p style="margin-left: 60px;"><strong>3、对多重条件选择语句举行优化简化</strong></p>
<h3 style="margin-left: 30px;">三、<strong>缺点</strong></h3>
<p style="margin-left: 60px;"><strong>1、随着计谋增多,计谋类会随之增长。</strong></p>
<p style="margin-left: 60px;"><strong>2、客户端必须知道所有的计谋类,而且自行决定使用哪一种计谋。</strong></p>
<h2><strong>总结</strong></h2>
<p>  到这里计谋模式就介绍完了。计谋模式紧张是针对的有一系列算法。并把他们都封装起来。他们之间可以自由切换。使这些算法的变革独立于客户端的变革。也就是把多种活动之间的变革分别举行封装起来。然后在我们调用的时间可以自由的举行切换调用。</p>
<p><strong>  这里我们在开篇有提到计谋模式的案例图和状态模式的有点相似。这里我们重点分析一些计谋模式和状态模式之间的区别吧:</strong></p>
<p style="margin-left: 60px;">1、情况脚色中的使命有所不同,<strong>计谋模式</strong>的情况脚色中具有一种委托作用,负责根据传进来的计谋调用其算法。但是<strong>状态模式</strong>中的情况脚色不但负责这活动方法的调用,还负责有记录状态变革、与具体的状态类协作。完成状态切换之后活动的切换。</p>
<p style="margin-left: 60px;">2、<strong>计谋模式</strong>紧张管理的题目是将内部的算法的改变对外部的影响降低。包管算法的自由切换。<strong>状态模式</strong>紧张管理的是状态的改变引起活动的变革、一个对象状态改变,从外界看来就好像是活动改变。</p>
<p style="margin-left: 60px;">3、<strong>计谋模式</strong>是一个算法的封装。这里封装的一个算法可以是故意义的对象,也可以是没故意义的逻辑片断。例如这里封装加密算法。各种加密算法,可以自由切换。算法必须是平行的。<strong>状态模式</strong>是要求一些列的状态变革随着有着活动的变革。要求拥有状态和活动。</p>
<hr />
<p style="margin-left: 30px;"><strong>即使受伤了,也要抬起头微笑着说,本日气候真好。</strong></p>
<p><strong><strong>   C#设计模式系列目录</strong></strong></p>
<p><strong>   接待各人扫描下方二维码,<strong>和我一起踏上设计模式的闯关之路吧!</strong></strong></p>
<p><strong>  <div align="center"></div></strong></p><br><br/><br/><br/><br/><br/>来源:<a href="https://www.cnblogs.com/hulizhong/p/11678188.html" target="_blank">https://www.cnblogs.com/hulizhong/p/11678188.html</a>
页: [1]
查看完整版本: 通俗易懂设计模式解析——策略模式