Python與設(shè)計模式之門面模式

一扶檐、火警報警器

假設(shè)有一組火警報警系統(tǒng),由三個子元件構(gòu)成:一個警報器瓦糕,一個噴水器底洗,一個自動撥打電話的裝置。其抽象如下:

class AlarmSensor:
    def run(self):
        print "Alarm Ring..."
class WaterSprinker:
    def run(self):
        print "Spray Water..."
class EmergencyDialer:
    def run(self):
        print "Dial 119..."

在業(yè)務(wù)中如果需要將三個部件啟動咕娄,例如亥揖,如果有一個煙霧傳感器,檢測到了煙霧圣勒。在業(yè)務(wù)環(huán)境中需要做如下操作:

if __name__=="__main__":
    alarm_sensor=AlarmSensor()
    water_sprinker=WaterSprinker()
    emergency_dialer=EmergencyDialer()
    alarm_sensor.run()
    water_sprinker.run()
    emergency_dialer.run()

但如果在多個業(yè)務(wù)場景中需要啟動三個部件费变,怎么辦?Ctrl+C加上Ctrl+V么圣贸?當(dāng)然可以這樣挚歧,但作為碼農(nóng)的基本修養(yǎng)之一,減少重復(fù)代碼是應(yīng)該會被很輕易想到的方法旁趟。這樣昼激,需要將其進(jìn)行封裝,在設(shè)計模式中锡搜,被封裝成的新對象橙困,叫做門面。門面構(gòu)建如下:

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()

這樣耕餐,業(yè)務(wù)場景中這樣寫就可以了:

if __name__=="__main__":
    emergency_facade=EmergencyFacade()
    emergency_facade.runAll()

打印如下:

Alarm Ring...
Spray Water...
Dial 119...

二凡傅、門面模式

門面模式也叫外觀模式,定義如下:要求一個子系統(tǒng)的外部與其內(nèi)部的通信必須通過一個統(tǒng)一的對象進(jìn)行肠缔。門面模式提供一個高層次的接口夏跷,使得子系統(tǒng)更易于使用。門面模式注重“統(tǒng)一的對象”明未,也就是提供一個訪問子系統(tǒng)的接口槽华。門面模式與之前說過的模板模式有類似的地方,都是對一些需要重復(fù)方法的封裝趟妥。但從本質(zhì)上來說猫态,是不同的。模板模式是對類本身的方法的封裝,其被封裝的方法也可以單獨使用亲雪;而門面模式勇凭,是對子系統(tǒng)的封裝,其被封裝的接口理論上是不會被單獨提出來用的义辕。

fasade設(shè)計模型

三虾标、門面模式的優(yōu)點和使用場景

優(yōu)點:

1、減少了系統(tǒng)之間的相互依賴灌砖,提高了系統(tǒng)的靈活璧函;
2、提高了整體系統(tǒng)的安全性:封裝起的系統(tǒng)對外的接口才可以用周崭,隱藏了很多內(nèi)部接口細(xì)節(jié)柳譬,若方法不允許使用,則在門面中可以進(jìn)行靈活控制续镇。

使用場景:

1美澳、為一個復(fù)雜的子系統(tǒng)提供一個外界訪問的接口。這類例子是生活還是蠻常見的摸航,例如電視遙控器的抽象模型制跟,電信運營商的用戶交互設(shè)備等;
2酱虎、需要簡化操作界面時雨膨。例如常見的扁平化系統(tǒng)操作界面等,在生活中和工業(yè)中都很常見读串。

四聊记、門面模式的缺點

1、門面模式的缺點在于恢暖,不符合開閉原則排监,一旦系統(tǒng)成形后需要修改,幾乎只能重寫門面代碼杰捂,這比繼承或者覆寫等方式舆床,或者其它一些符合開閉原則的模式風(fēng)險都會大一些。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嫁佳,一起剝皮案震驚了整個濱河市挨队,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蒿往,老刑警劉巖盛垦,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異瓤漏,居然都是意外死亡情臭,警方通過查閱死者的電腦和手機(jī)省撑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進(jìn)店門赌蔑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來俯在,“玉大人,你說我怎么就攤上這事娃惯□卫郑” “怎么了?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵趾浅,是天一觀的道長愕提。 經(jīng)常有香客問我,道長皿哨,這世上最難降的妖魔是什么浅侨? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮证膨,結(jié)果婚禮上如输,老公的妹妹穿的比我還像新娘。我一直安慰自己央勒,他們只是感情好不见,可當(dāng)我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著崔步,像睡著了一般稳吮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上井濒,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天灶似,我揣著相機(jī)與錄音,去河邊找鬼瑞你。 笑死酪惭,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的捏悬。 我是一名探鬼主播撞蚕,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼过牙!你這毒婦竟也來了甥厦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤寇钉,失蹤者是張志新(化名)和其女友劉穎刀疙,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扫倡,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡谦秧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年竟纳,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疚鲤。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡锥累,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出集歇,到底是詐尸還是另有隱情桶略,我是刑警寧澤,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布诲宇,位于F島的核電站际歼,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏姑蓝。R本人自食惡果不足惜鹅心,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望纺荧。 院中可真熱鬧旭愧,春花似錦、人聲如沸虐秋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽客给。三九已至用押,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間靶剑,已是汗流浹背蜻拨。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留桩引,地道東北人缎讼。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像坑匠,于是被迫代替她去往敵國和親血崭。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,658評論 2 350

推薦閱讀更多精彩內(nèi)容