Python筆記之facade模式
facade模式,即門面模式,也稱外觀模式,這個(gè)模式的核心思想是使用facade對象為外部客戶端提供一個(gè)統(tǒng)一的訪問一組子系統(tǒng)的接口,即客戶端不會直接與各個(gè)子系統(tǒng)交互,而是通過facade對象與各個(gè)子系統(tǒng)進(jìn)行通信并使用子系統(tǒng)的相應(yīng)功能。
可以通過下面這個(gè)圖來理解facade模式:

子系統(tǒng):各個(gè)子系統(tǒng)原則上都是獨(dú)立存在的,互不干涉的,重要的是它們都不會去關(guān)注facade對象,更不會去引用facade對象。
facade:facade對象負(fù)責(zé)將各個(gè)子系統(tǒng)組合成在一起,并為外部提供一個(gè)“舒適的外觀”和訪問接口。
客戶端:客戶端通過facade對象去和各個(gè)子系統(tǒng)進(jìn)行交互,不會直接去和各個(gè)子系統(tǒng)打交道。
簡單示例:
class Shampoo:
"""子系統(tǒng):賣各種洗發(fā)露"""
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:
"""子系統(tǒng):賣各種洗衣粉"""
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:
"""子系統(tǒng):賣各種抽紙"""
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模式思想相近的編程原則也可以參考下,但需要注意的是“原則”本身需要根據(jù)具體情況來靈活應(yīng)用,而不是一定要這么做:
最少知識原則:最少知識意味著需要盡量減少對象之間的交互,但是也需要注意以下幾點(diǎn):
- 在設(shè)計(jì)系統(tǒng)時(shí),在創(chuàng)建每個(gè)對象時(shí),都需要多考查下會與之交互的類的數(shù)量以及交互的方式。
- 避免多個(gè)對象彼此緊密耦合的情況。
迪米特法則:它是一個(gè)設(shè)計(jì)準(zhǔn)則,包含以下幾點(diǎn):
- 每個(gè)單元對系統(tǒng)中其他單元知道得越少越好。
- 每個(gè)單元只與其朋友交流。
- 單元不應(yīng)該知道它操作的對象的內(nèi)部細(xì)節(jié)。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
用Django實(shí)現(xiàn)一個(gè)可運(yùn)行的區(qū)塊鏈應(yīng)用
這篇文章主要介紹了用Django實(shí)現(xiàn)一個(gè)可運(yùn)行的區(qū)塊鏈應(yīng)用,需要的朋友可以參考下2018-03-03
pycharm遠(yuǎn)程連接docker容器的操作流程
這篇文章主要給大家介紹了pycharm遠(yuǎn)程連接docker容器的操作流程,文中通過代碼示例和圖文講解介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下2023-08-08
如何爬取通過ajax加載數(shù)據(jù)的網(wǎng)站
這篇文章主要介紹了如何爬取通過ajax加載數(shù)據(jù)的網(wǎng)站,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08
Python中matplotlib庫安裝失敗的經(jīng)驗(yàn)總結(jié)(附pycharm配置anaconda)
最近根據(jù)領(lǐng)導(dǎo)布置的學(xué)習(xí)任務(wù),開始學(xué)習(xí)python中的matplotlib,朋友告訴我這個(gè)很簡單,然而剛踏入安裝的門檻,就遇到了安裝不成功的問題,下面這篇文章主要給大家介紹了關(guān)于Python中matplotlib庫安裝失敗的經(jīng)驗(yàn)總結(jié),需要的朋友可以參考下2022-08-08
python中l(wèi)ist*n生成多維數(shù)組與for循環(huán)生成多維數(shù)組的區(qū)別說明
這篇文章主要介紹了python中l(wèi)ist*n生成多維數(shù)組與for循環(huán)生成多維數(shù)組的區(qū)別說明,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05

