当前位置:编程学习 > C#/ASP.NET >>

C#设计模式——策略模式(Strategy Pattern)

 

一、概述
我们来实现一个企业的工资系统,该企业中不同级别的员工工资算法都不相同,针对该问题,最容易想到的莫过于在代码中堆积一大堆if…else…语句或者是switch…case…语句。如果该企业中不同级别的员工过多,或是对级别的调整比较频繁,那该系统就会显得复杂而脆弱。如何能将对象和算法解耦,从而使得在系统运行时能透明的改变对象的算法呢?这就到了策略模式大显身手的时候了。
二、策略模式
策略模式定义了一系列算法,把它们一个个封装起来,并且使它们可相互替换。该模式可使得算法能独立于使用它的客户而变化。
策略模式的结构图如下:

\

Context代表需要改变算法的那个对象,它维护了一个对Strategy对象的引用,可以定义一个接口允许Strategy对象来访问它的数据。
Strategy定义了所支持算法的公共接口,Context通过这个接口来调用ConcreteStrategy定义的算法。
ConcreteStrategy实现了具体的算法。
三、示例

 

 

下面我们使用策略模式来实现本文开头提到的企业工资系统。

首先定义算法的公共接口

 

1     public interface Salary

2     {

3         int Caculator();

4     }

接着实现具体的算法

 

 1     public class ManagerSalary : Salary

 2     {

 3         public int Caculator()

 4         {

 5             return 1000;

 6         }

 7     }

 8

 9     public class EmployeeSalary : Salary

10     {

11         public int Caculator()

12         {

13             return 800;

14         }

15     }

然后定义那个需要动态改变算法的对象

 

 1     public class Employee

 2     {

 3         public Salary Salary {get;set;}

 4         public Employee(Salary salary)

 5         {

 6             Salary = salary;

 7         }

 8         public int GetSalary()

 9         {

10             return Salary.Caculator();

11         }

12     }

最后看一下如何调用

 

1     static void Main(string[] args)

2     {

3         Employee employee = new Employee(new EmployeeSalary());

4         Console.WriteLine("Employee salary is:{0}", employee.GetSalary().ToString());

5         employee.Salary = new ManagerSalary();

6         Console.WriteLine("Employee salary is:{0}", employee.GetSalary().ToString());

7

8         Console.ReadLine();

9     }

 

摘自 saville

<script></script>
补充:软件开发 , C# ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,