通俗易懂设计模式解析——策略模式
<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]