外觀模式,一個(gè)每天都在用,卻被多數(shù)人在面試中忽視的模式
大家好,這里是每周都在陪你一起進(jìn)步的網(wǎng)管~!今天繼續(xù)設(shè)計(jì)模式學(xué)習(xí)之旅,這次咱們分享個(gè)大家每個(gè)人在寫代碼時(shí)都用過(guò),但面試時(shí)經(jīng)常忽視它的設(shè)計(jì)模式--外觀模式,我們一起來(lái)看看吧。
現(xiàn)代的軟件系統(tǒng)都非常復(fù)雜,盡管我們已經(jīng)想盡一切方法將其“分而治之”,把一個(gè)系統(tǒng)劃分為好幾個(gè)較小的子系統(tǒng)了,但是仍然可能會(huì)存在這樣的問(wèn)題:子系統(tǒng)內(nèi)有非常多的類,客戶端往往需要和許多對(duì)象打交道之后才能完成想要完成的功能。
模式的由來(lái)
在我們的生活中醫(yī)院就是這樣的。一般的醫(yī)院都會(huì)分為掛號(hào)、門診、化驗(yàn)、收費(fèi)、取藥等。看病的病人要想治好自己的病(相當(dāng)于一個(gè)客戶端想要實(shí)現(xiàn)自己的功能)就要和醫(yī)院的各個(gè)部門打交道。首先,病人需要掛號(hào),然后門診,如果醫(yī)生要求化驗(yàn)的話,病人就要去化驗(yàn),然后再回到門診室,最后拿藥,經(jīng)過(guò)一系列復(fù)雜的過(guò)程后才能完成看病的過(guò)程。如下圖所示:
如果我們?cè)卺t(yī)院設(shè)立一個(gè)接待員的話,病人只負(fù)責(zé)和接待員接觸,由接待員負(fù)責(zé)與醫(yī)院的各個(gè)部門打交道,如下圖所示:
醫(yī)院設(shè)立的接待員的角色就是我們今天要介紹的外觀模式,系統(tǒng)通過(guò)引入外觀模式讓需要調(diào)用多個(gè)子系統(tǒng)各自部分的功能接口以完成的需求,變?yōu)檎{(diào)用方只需要跟外觀提供的統(tǒng)一功能進(jìn)行交互即可。
引入外觀模式帶來(lái)的變化
模式定義
外觀模式又稱為門面模式,它是一種結(jié)構(gòu)型模式。引入外觀模式后調(diào)用方與多個(gè)子系統(tǒng)的通信必須通過(guò)一個(gè)統(tǒng)一的外觀對(duì)象進(jìn)行,外觀模式為子系統(tǒng)中的功能接口提供一個(gè)一致的界面,此模式定義了一個(gè)高層接口,這個(gè)接口使得這些子系統(tǒng)更加容易使用。
外觀模式的結(jié)構(gòu)
外觀模式的結(jié)構(gòu)其實(shí)很簡(jiǎn)單,用一個(gè)UML圖就能描述清楚外觀模式里擁有哪些角色以及它們各自的特點(diǎn),下面我們看一下外觀模式的類結(jié)構(gòu)。
外觀模式編程實(shí)現(xiàn)
下面我們用Go代碼實(shí)現(xiàn)一個(gè)外觀模式。
這個(gè)例子里我們把電腦擁有的CPU、RAM內(nèi)存和硬盤視為子系統(tǒng),調(diào)用方想啟動(dòng)電腦就得分別啟動(dòng)這三個(gè)子系統(tǒng)才行,所以我們?cè)谧酉到y(tǒng)上增加一個(gè)外觀對(duì)象,讓調(diào)用方直接調(diào)用外觀對(duì)象,由外觀對(duì)象再去分別對(duì)接子系統(tǒng)最終完成電腦的啟動(dòng)。
該實(shí)例源代碼引用自:https://github.com/yksz/go-design-patterns/blob/master/structure/facade.go
本文的完整源碼,已經(jīng)同步收錄到我整理的電子教程里啦,可向我的公眾號(hào)「網(wǎng)管叨bi叨」發(fā)送關(guān)鍵字【設(shè)計(jì)模式】領(lǐng)取。
公眾號(hào)「網(wǎng)管叨bi叨」發(fā)送關(guān)鍵字【設(shè)計(jì)模式】領(lǐng)取。
使用外觀模式的知名庫(kù)
要說(shuō)外觀模式在實(shí)際開發(fā)中的應(yīng)用,首先讓我想起來(lái)的就是Java 里的Slf4j,它是一個(gè)抽象層,讓用戶對(duì)日志的操作統(tǒng)一由Slf4j跟用戶去對(duì)接,用戶用這個(gè)抽象層的API來(lái)寫日志, 底層具體用什么日志工具實(shí)現(xiàn)用戶完全不用關(guān)心,由Slf4j來(lái)對(duì)接Log4j、LogBack 這些日志工具,這樣就可以更方便地移植了。
這個(gè)抽象層 Slf4j 就是Simple logging Facade For Java 的簡(jiǎn)稱,從名字里我們也能看出來(lái),它是一個(gè)外觀模式的實(shí)踐應(yīng)用,由于普及度很高,很多講解外觀模式的教程里都會(huì)提及它,拿它的實(shí)現(xiàn)來(lái)給讀者做分析。
總結(jié)
外觀模式的優(yōu)點(diǎn)
- 簡(jiǎn)化了調(diào)用過(guò)程,不用深入了解子系統(tǒng),以防給子系統(tǒng)帶來(lái)風(fēng)險(xiǎn)。
- 減少系統(tǒng)依賴,松散耦合。
- 更好地劃分訪問(wèn)層次,提高了安全性。
- 遵循迪米特法則
外觀模式的缺點(diǎn)
- 當(dāng)增加子系統(tǒng)和擴(kuò)展子系統(tǒng)行為時(shí),需要對(duì)外觀進(jìn)行重復(fù)更改,不符合開閉原則,可能容易帶來(lái)未知風(fēng)險(xiǎn)。