一、概述
我們來實現一個企業的工資系統,該企業中不同級別的員工工資算法都不相同,針對該問題,最容易想到的莫過於在代碼中堆積一大堆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>