原文:C#设计模式之十九计谋模式(Stragety Pattern)【行为型】
一、引言
今天我们开始讲“行为型”设计模式的第七个模式,该模式是【计谋模式】,英文名称是:Stragety Pattern。在现实生活中,计谋模式的例子也非每每见,例如,在一个公司中,会有各类事情人员,好比:有的是普通员工,有的是软件架构师,有的是部门经理,固然也会有公司的CEO。这些事情人员卖力的事情差别,担负的责任差别,自然得到的工钱也就差别了。每种事情人员都有本身的人为,但是每个工种的事情人员的人为的计算要领又是不一样的。如果所有人的人为都一样,必定会天下大乱的。如果不给与计谋模式来实现这个需求的话,我们可能会这样来做,我们会界说一个人为类,该类有一个属性来标识事情人员的类型,并且有一个计算人为的CalculateSalary()要领,在该要领体内需要对事情人员类型进行判断,通过if-else语句来针对差此外事情人员类型来计算其所得人为。这样的实现确实可以解决这个场景,但是这样的设计倒霉于扩展,如果系统后期需要增加一种新的工种时,此时不得不回去改削CalculateSalary要领来多添加一个判断语句,这样明显违背了“开放——关闭”原则。此时,我们可以考虑使用计谋模式来解决这个问题,既然人为计算要领是这个场景中的变革部分,此时自然可以想到对人为算法进行抽象,差别工种的人为可以用不用的计谋算法具体实现,想要得到某个事情人员的人为,用其相应的人为算法计谋来计算就可以了。
二、计谋模式的详细介绍
2.1、动机(Motivate)
在软件构建过程中,某些东西使用的算法可能多种多样,经常转变,如果将这些算法都编码到东西中,将会使东西变得异常庞大;而且有时候撑持不使用的算法也是一本性能承担。如安在运行时按照需要透明地变动东西的算法?将算法与东西自己解耦,从而制止上述问题?
2.2、意图(Intent)
界说一系列算法,把它们一个个封装起来,并且使它们可互相替换。该模式使得算法可独立于使用它的客户而变革。 ——《设计模式》GoF
2.3、布局图(Structure)
2.4、模式的构成
可以看出,在计谋模式的布局图有以下角色:
(1)、环境角色(Context):持有一个Strategy类的引用。
需要使用ConcreteStrategy供给的算法。
内部维护一个Strategy的实例。
卖力动态设置运行时Strategy具体的实现算法。
卖力跟Strategy之间的交互和数据通报
(2)、抽象计谋角色(Strategy):界说了一个大众接口,各类差此外算法以差此外方法实现这个接口,Context使用这个接口挪用差此外算法,一般使用接口或抽象类实现。
(3)、具体计谋角色(ConcreteStrategy):实现了Strategy界说的接口,供给具体的算法实现。
2.5、计谋模式的代码实现
在现实生活中,计谋模式的例子也是很多的,例如:一个公司会有很多事情种类,每个事情种类卖力的事情差别,自然每个工种的人为计算要领也会有千差万别,我们今天就以人为的计算为例来说明计谋模式的使用,我们直接上代码,但是实际编码中切记别这样,我们要通过迭代的方法使用模式。实现代码如下:
1 namespace 计谋模式的实现 2 { 3 //环境角色---相当于Context类型 4 public sealed class SalaryContext 5 { 6 private ISalaryStrategy _strategy; 7 8 public SalaryContext(ISalaryStrategy strategy) 9 { 10 this._strategy = strategy; 11 } 12 13 public ISalaryStrategy ISalaryStrategy 14 { 15 get { return _strategy; } 16 set { _strategy = value; } 17 } 18 19 public void GetSalary(double income) 20 { 21 _strategy.CalculateSalary(income); 22 } 23 } 24 25 //抽象计谋角色---相当于Strategy类型 26 public interface ISalaryStrategy 27 { 28 //人为计算 29 void CalculateSalary(double income); 30 } 31 32 //措施员的人为--相当于具体计谋角色ConcreteStrategyA 33 public sealed class ProgrammerSalary : ISalaryStrategy 34 { 35 public void CalculateSalary(double income) 36 { 37 Console.WriteLine("我的人为是:根基人为(" + income + ")底薪(" + 8000 + ")+加班费+项目奖金(10%)"); 38 } 39 } 40 41 //普通员工的人为---相当于具体计谋角色ConcreteStrategyB 42 public sealed class NormalPeopleSalary : ISalaryStrategy 43 { 44 public void CalculateSalary(double income) 45 { 46 Console.WriteLine("我的人为是:根基人为(" + income + ")底薪(3000)+加班费"); 47 } 48 } 49 50 //CEO的人为---相当于具体计谋角色ConcreteStrategyC 51 public sealed class CEOSalary : ISalaryStrategy 52 { 53 public void CalculateSalary(double income) 54 { 55 Console.WriteLine("我的人为是:根基人为(" + income + ")底薪(20000)+项目奖金(20%)+公司股票"); 56 } 57 } 58 59 60 public class Client 61 { 62 public static void Main(String[] args) 63 { 64 //普通员工的人为 65 SalaryContext context = new SalaryContext(new NormalPeopleSalary()); 66 context.GetSalary(3000); 67 68 //CEO的人为 69 context.ISalaryStrategy = new CEOSalary(); 70 context.GetSalary(6000); 71 72 Console.Read(); 73 } 74 } 75 }