標籤:多媒體 識別 oca 拖拽 main dia 理念 ase one
面板模式
說明
面板模式又叫做門面模式。在物件導向程式設計中,解耦是一種推崇的理念。但事實上由於某些系統中過於複雜,從而增加了用戶端與子系統之間的耦合度。例如:在家觀看多媒體影院時,更希望按下一個按鈕就能實現影碟機,電視,音響的協同工作,而不是說每個機器都要操作一遍。這種情況下可以採用面板模式,即引入一個類對子系統進行封裝,讓用戶端與其進行互動。
面板模式(Facade Pattern):外部與一個子系統的通訊必須通過一個統一的外觀對象進行,為子系統中的一組介面提供一個一致的介面,面板模式定義了一個高層介面,這個介面使得這一子系統更加容易使用。面板模式又稱為門面模式,它是一種對象結構型模式。
?
結構說明:
面板模式包含如下角色: Facade: 外觀角色 SubSystem:子系統角色
執行個體:
假設有一組火警警示系統,由三個子元件構成:一個警報器,一個噴水器,一個自動撥打到電話的裝置。
#當火警發生時,先警報器響起警報,噴水器開始噴水,最後開始撥打火警電話class AlarmSensor: def run(self): print "Alarm Ring..."class WaterSprinker: def run(self): print "Spray Water..."class EmergencyDialer: def run(self): print "Dial 119..."#業務代碼if __name__=="__main__": alarm_sensor=AlarmSensor() water_sprinker=WaterSprinker() emergency_dialer=EmergencyDialer() alarm_sensor.run() water_sprinker.run() emergency_dialer.run()
列印結果為:
Alarm Ring...
Spray Water...
Dial 119...
雖然也完成了業務需求,但是明顯的是客戶的負擔較重,用戶端與子系統的耦合度太大。如果在多個業務情境中需要啟動三個組件,複製粘貼當仍然可以解決。但是減少重複代碼是應該會被很輕易想到的方法。這樣,需要將其進行封裝,在設計模式中,被封裝成的新對象,叫做外觀。
class AlarmSensor: def run(self): print("Alarm Ring...")class WaterSprinker: def run(self): print("Spray Water...")class EmergencyDialer: def run(self): print("Dial 119...")class EmergencyFacade: """ 外觀類中封裝了對子系統的操作 """ def __init__(self): self.alarm_sensor=AlarmSensor() self.water_sprinker=WaterSprinker() self.emergency_dialer=EmergencyDialer() def runAll(self): self.alarm_sensor.run() self.water_sprinker.run() self.emergency_dialer.run()if __name__=="__main__": emergency_facade=EmergencyFacade() emergency_facade.runAll()
列印結果:
Alarm Ring...
Spray Water...
Dial 119...
完成了業務需求。
模式分析
根據“單一職責原則”,在軟體中將一個系統劃分為若干個子系統有利於降低整個系統的複雜性,一個常見的設計目標是使子系統間的通訊和相互依賴關係達到最小,而達到該目標的途徑之一就是引入一個外觀對象,它為子系統的訪問提供了一個簡單而單一的入口。 面板模式也是“迪米特法則”的體現,通過引入一個新的外觀類可以降低原有系統的複雜度,同時降低客戶類與子系統類的耦合度。
面板模式要求一個子系統的外部與其內部的通訊通過一個統一的外觀對象進行,外觀類將用戶端與子系統的內部複雜性分隔開,使得用戶端只需要與外觀對象打交道,而不需要與子系統內部的很多個物件打交道。 面板模式的目的在於降低系統的複雜程度。 面板模式從很大程度上提高了用戶端使用的便捷性,使得用戶端無須關心子系統的工作細節,通過外觀角色即可調用相關功能。
優點:
主要優點在於對客戶屏蔽子系統組件,減少了客戶處理的對象數目並使得子系統使用起來更加容易,它實現了子系統與客戶之間的松耦合關係,並降低了大型軟體系統中的編譯依賴性,簡化了系統在不同平台之間的移植過程;
缺點:
其缺點在於不能很好地限制客戶使用子系統類,而且在不引入抽象外觀類的情況下,增加新的子系統可能需要修改外觀類或用戶端的原始碼,違背了“開閉原則”。
使用方式:
適用情況包括:要為一個複雜子系統提供一個簡單介面;客戶程式與多個子系統之間存在很大的依賴性;在層次化結構中,需要定義系統中每一層的入口,使得層與層之間不直接產生聯絡。
?
識別圖中二維碼,領取python全套視頻資料
python-面板模式