意圖:工具
用一個容器來管理一系列相同的邏輯實現,這些相同的邏輯實現都源自同一個抽象;經過容器根據具體的邏輯來建立具體的邏輯處理實現對象,從而能夠爲未來的邏輯實現擴展制定出一個標準,以達到未來的實現邏輯能夠平滑的插入到容器中來達到將來的同類實現邏輯的擴展。spa
適用性:設計
當發現一些邏輯用來處理類似的業務時,而且只是由於某一個固定的關鍵節點不一樣,其餘處理很類似時code
而且將來還會有相似的 處理邏輯添加進來時對象
是否是感受有點雲裏霧裏的,那先看下代碼嗎。因爲手頭目前沒有任何的畫圖工具,以後會補上UML圖。blog
1 /*扣款設備容器接口*/ 2 public interface ICostContainer 3 { 4 //扣某種貨幣類型的金額 5 bool cost(Currency currency); 6 } 7 8 public class Currency 9 { 10 public DeviceType{get;set;} 11 public int Balance{get;set;} 12 } 13 14 public class CostContainer 15 { 16 private Dictionary<string, ICostDevice> costDeviceDict = new Dictionary<string, ICostDevice>(); 17 18 public CostContainer() 19 { 20 //經過配置文件,或反射,或其餘方式找到全部ICostDevice, 21 //把每一個扣款設備add到costDeviceDict 22 costDeviceDict.add(ICostDevice.DeviceType,ICostDevice); 23 ... 24 } 25 26 public bool cost(Currency currency) 27 { 28 CostDeviceContainer costDeviceContainer = //經過一些面向對象的構建方式獲得容器對象 29 ICostDevice costDevice = CostContainer.get(currency.DeviceType); 30 if(costDeviceDict == null) return false; 31 return costDevice.cost(currency); 32 } 33 } 34 35 /*扣款設備*/ 36 public interface ICostDevice 37 { 38 String DeviceType{get;} 39 bool Cost(Currency currency); 40 } 41 42 public classs RMBCostDevice:ICostDevice 43 { 44 public String DeviceType 45 { 46 get{return "RMBCoster"} 47 } 48 49 public bool Cost(Currency currency) 50 { 51 // 人民幣的扣款設備處理邏輯 52 } 53 } 54 55 public class DollorCostDevice:ICostDevice 56 { 57 public String DeviceType 58 { 59 get{return "DollorCoster"} 60 } 61 62 public bool Cost(Currency currency) 63 { 64 // 美圓的扣款設備處理邏輯 65 } 66 }
首先這個模式裏有些是固定的,如貨幣對象。接口
假如未來會接入英鎊的扣款設備,那個這個扣款設備的的邏輯處理類應該實現ICostDevice就是了。從總體上這個模式遵循了面向對象的開閉原則,對擴展是打開的,對已有的實現修改對關閉的。get
很方便支持擴展,固然你的構建實現類的代碼須要通過本身面向對象的設計來規避對已有代碼修改的關閉的,你能夠採用抽象工廠之類或其餘的設計來封裝這塊代碼。string
先寫到這裏吧,該下班了,明天再作詳細的解釋和審驗。io