python-外觀模式

北京-IT拾荒者發表於2018-09-05

外觀模式

說明 外觀模式又叫做門面模式。在物件導向程式設計中,解耦是一種推崇的理念。但事實上由於某些系統中過於複雜,從而增加了客戶端與子系統之間的耦合度。例如:在家觀看多媒體影院時,更希望按下一個按鈕就能實現影碟機,電視,音響的協同工作,而不是說每個機器都要操作一遍。這種情況下可以採用外觀模式,即引入一個類對子系統進行包裝,讓客戶端與其進行互動。 外觀模式(Facade Pattern):外部與一個子系統的通訊必須通過一個統一的外觀物件進行,為子系統中的一組介面提供一個一致的介面,外觀模式定義了一個高層介面,這個介面使得這一子系統更加容易使用。外觀模式又稱為門面模式,它是一種物件結構型模式。

python-外觀模式
結構說明:

外觀模式包含如下角色: 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全套視訊資料

相關文章