Python筆記之facade模式
阿新 • • 發佈:2020-01-09
facade模式,即門面模式,也稱外觀模式,這個模式的核心思想是使用facade物件為外部客戶端提供一個統一的訪問一組子系統的介面,即客戶端不會直接與各個子系統互動,而是通過facade物件與各個子系統進行通訊並使用子系統的相應功能。
可以通過下面這個圖來理解facade模式:
子系統:各個子系統原則上都是獨立存在的,互不干涉的,重要的是它們都不會去關注facade物件,更不會去引用facade物件。
facade:facade物件負責將各個子系統組合成在一起,併為外部提供一個“舒適的外觀”和訪問介面。
客戶端:客戶端通過facade物件去和各個子系統進行互動,不會直接去和各個子系統打交道。
簡單示例:
class Shampoo: """子系統:賣各種洗髮露""" def __init__(self): print('We sell all kinds of shampoo!') def piaorou_500ml(self,number): print('This is 500ml piaorou shampoo! Total: %d' % number) class WashingPowder: """子系統:賣各種洗衣粉""" def __init__(self): print('We sell all kinds of washing powder!') def libai_3kg(self,number): print('This is 3kg libai washing powder! Total: %d' % number) class Tissue: """子系統:賣各種抽紙""" def __init__(self): print('We sell all kinds of tissue!') def jierou_200sheets(self,number): print('This is 200 sheets tissue! Total: %d' % number) class Salesman: """facade:售貨員""" def __init__(self): self.shampoo = Shampoo() self.washing_powder = WashingPowder() self.tissue = Tissue() print('What can I help you?') def sale_for_family(self): """家庭套餐""" self.shampoo.piaorou_500ml(1) self.washing_powder.libai_3kg(2) self.tissue.jierou_200sheets(6) class UncleLi: """客戶端:李大爺""" def __init__(self): print('I want bug something!') def buy_for_family(self): """直接從售貨員那裡購買家庭套餐""" sale_man = Salesman() sale_man.sale_for_family()
其他與facade模式思想相近的程式設計原則也可以參考下,但需要注意的是“原則”本身需要根據具體情況來靈活應用,而不是一定要這麼做:
最少知識原則:最少知識意味著需要儘量減少物件之間的互動,但是也需要注意以下幾點:
- 在設計系統時,在建立每個物件時,都需要多考查下會與之互動的類的數量以及互動的方式。
- 避免多個物件彼此緊密耦合的情況。
迪米特法則:它是一個設計準則,包含以下幾點:
- 每個單元對系統中其他單元知道得越少越好。
- 每個單元只與其朋友交流。
- 單元不應該知道它操作的物件的內部細節。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。