python 外觀模式

2021-08-27 05:02:24 字數 2743 閱讀 4171

外觀模式又叫做門面模式。在物件導向程式設計中,解耦是一種推崇的理念。但事實上由於某些系統中過於複雜,從而增加了客戶端與子系統之間的耦合度。例如:在家**多**影院時,更希望按下乙個按鈕就能實現影碟機,電視,音響的協同工作,而不是說每個機器都要操作一遍。這種情況下可以採用外觀模式,即引入乙個類對子系統進行包裝,讓客戶端與其進行互動。

外觀模式(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 外觀模式

內容 為子系統中的一組介面提供乙個一致的介面,外觀模式定義了乙個高層介面,這個介面使得這一系統更加容易使用 角色外觀 facade 子系統類 subsystem classes 子系統 class cpu def run self print cpu開始執行 def stop self print ...

python外觀模式

外觀模式隱藏了內部物件的複雜性,向外提供了簡單的一致性介面 from enum import enum from abc import abcmeta,abstractmethod state enum state new running sleeping restart zombie class ...

python設計模式 外觀模式

學習版本3.5.2 外觀模式 facade pattern 向客戶端提供乙個可以訪問系統的介面,隱藏了系統的複雜性。比如說,生產a產品需要abc三個流水線生產的零件,我只想管a產品的生產。class productionlinea object def create self print creat...