一、概述 我们来实现一个企业的工资系统,该企业中不同级别的员工工资算法都不相同,针对该问题,最容易想到的莫过于在代码中堆积一大堆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 }
|