整合成通用系統
讓我們回顧一下該系統的發展歷程:
最初,我們只考慮將Softo系統運行於中國企業。但隨著MaxDO公司業務向海外拓展, MaxDO需要將該系統移植給美國使用。
移植時,MaxDO不得不拋棄中國企業的業務規則類ChineseTax和ChineseBonus, 然後為美國企業新建兩個業務規則類: AmericanTax,AmericanBonus。最後修改了業務規則調用Calculator類。
結果我們發現:每當Softo系統移植的時候,就拋棄原來的類。現在,如果中國聯想集團要購買該系統,我們不得不再次拋棄AmericanTax,AmericanBonus,修改回原來的業務規則。
一個可以立即想到的做法就是在系統中保留所有業務規則模型,即保留中國和美國企業工資運算規則。
通過保留中國企業和美國企業的業務規則模型,如果該系統在美國企業和中國企業之間切換時,我們僅僅需要修改Caculator類即可。
讓移植工作更簡單
前面系統的整合問題在於:當系統在客戶在美國和中國企業間切換時仍然需要修改Caculator代碼。
一個維護性良好的系統應該遵循“開閉原則”。即:封閉對原來代碼的修改,開放對原來代碼的擴展(如類的繼承,接口的實現)
我們發現不論是中國企業還是美國企業,他們的業務運規則都采用同樣的計算接口。於是很自然地想到建立兩個業務接口類Tax,Bonus,然後讓AmericanTax、AmericanBonus和ChineseTax、ChineseBonus分別實現這兩個接口, 據此修正後的模型如下:
此時客戶端代碼如下:
1
2using System;
3
4namespace InterfaceSalary
5{
6 /**//// <summary>
7 /// 客戶端程序調用
8 /// </summary>
9 public class Calculator
10 {
11 public static void Main(string[] args)
12 {
13 Bonus bonus = new ChineseBonus();
14 double bonusValue = bonus.Calculate();
15
16 Tax tax = new ChineseTax();
17 double taxValue = tax.Calculate();
18
19 double salary = 4000 + bonusValue - taxValue;
20
21 Console.WriteLine("Chinaese Salary is:" + salary);
22 Console.ReadLine();
23 }
24 }
25}
26