C#设计模式之十九策略模式(Stragety Pattern)【行为型】
一、引言 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 ISalaryStrategy ISalaryStrategy 14 15 get { return _strategy; } 16 set { _strategy = value; } 17 18 19 void GetSalary(double income) 20 21 _strategy.CalculateSalary(income); 22 23 } 24 25 抽象策略角色---相当于Strategy类型 26 interface ISalaryStrategy 27 28 工资计算 29 void CalculateSalary( income); 30 31 32 程序员的工资--相当于具体策略角色ConcreteStrategyA 33 ProgrammerSalary : ISalaryStrategy 34 35 36 37 Console.WriteLine("我的工资是:基本工资(" + income + )底薪(" + 8000 + )+加班费+项目奖金(10%)"); 38 39 40 41 普通员工的工资---相当于具体策略角色ConcreteStrategyB 42 NormalPeopleSalary : ISalaryStrategy 43 44 45 46 Console.WriteLine()底薪(3000)+加班费47 48 49 50 CEO的工资---相当于具体策略角色ConcreteStrategyC 51 CEOSalary : ISalaryStrategy 52 53 54 55 Console.WriteLine()底薪(20000)+项目奖金(20%)+公司股票56 57 58 59 60 Client 61 62 static void Main(String[] args) 63 64 普通员工的工资 65 SalaryContext context = new SalaryContext(new NormalPeopleSalary()); 66 context.GetSalary(300067 68 CEO的工资 69 context.ISalaryStrategy = CEOSalary(); 70 context.GetSalary(600071 72 Console.Read(); 73 74 75 } 三、策略模式的实现要点: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- Error:(65) Error parsing XML: not well-formed (invalid
- JSON.parse()和JSON.stringify()
- c# – 在Web服务器上部署可执行进程的最佳方法是什么?
- Ruby windows命令提示前一行
- Cocos2d-x下Lua调用自定义C++类和函数的最佳实践
- Qt 如何自动安装常用依赖?
- iPhone – 如何更改backBarButtonItem的颜色?
- 在红宝石中,对于以问号结尾的方法名称,是否是真实的惯用语?
- C++ 中"priority_queue" 优先级队列实例详解
- Oracle参数设置教程之set和reset的实用案例