外觀模式(facade pattern),為子系統中的一組介面提供乙個統一的高層介面,使得子系統更容易使用。
外觀模式又稱為門面模式,它是一種物件結構型模式,遵循迪公尺特法則,又稱最少知道原則。
現代的軟體系統都非常複雜,儘管我們已經想盡一切方法將其「分而治之」,把乙個系統劃分為好幾個較小的子系統了,但是仍然可能會存在這樣的問題:子系統內有非常多的類,客戶端往往需要和許多物件打交道之後 才能完成想要完成的功能。
在我們的生活中醫院就是這樣的。一般的醫院都會分為**、門診、化驗、收費、取藥等。看病的病人要想治好自己的病(相當於乙個客戶端想要實現自己的功能)就要和醫院的各個部門打交道。首先,病人需要**,然後門診,如果醫生要求化驗的話,病人就要去化驗,然後再回到門診室,最後拿藥,經過一系列複雜的過程後才能完成看病的過程。如下圖所示:
解決方案:
解決這種不便的方式就是引入外觀模式。如果我們在醫院設立乙個接待員的話,病人只負責和接待員接觸,由接待員負責與醫院的各個部門打交道,讓接待員完全幫助我們實現「看病」各個操作,如下圖所示:
外觀模式的基本組成:
外觀角色 facade:模式的核心,被客戶 client 呼叫,知道各個子系統的概念。根據客戶角色的需求定製功能組合。
子系統角色 subsystem:實現子系統的功能。
客戶角色 client:呼叫 facade 角色獲取相應的功能。
下面以電腦開機為例子,正常情況下,我們只需要按下開機鍵即可,其他操作,比如 bios、開啟作業系統這些操作是不需要使用者關心的。
<?php輸出結果://外觀模式
//下面以電腦開關機為例子,正常情況下,我們只需要按下開機鍵即可,其他操作,比如 bios、開啟作業系統這些操作是不需要使用者關心的。
class
operatingsystem
public
function shutdown()
public
function login()
}class
bios
//啟動作業系統
public
function launch(operatingsystem $os)
//電源關閉
public
function power_down()
}class
facade
public
function turn_on()
public
function turn_off() }//
client
$facade = new
facade();
//computer on
$facade->turn_on();
echo ""
;//computer off
$facade->turn_off();
硬體自檢 啟動作業系統 開啟作業系統 登入作業系統
關閉作業系統 電源關閉
設計模式之外觀模式
外觀模式提供了乙個統一的介面,用來訪問子系統中的一群介面。這樣可以避免客戶端和子系統之間的緊耦合。這種模式需要將一系列的子系統組合到外觀中,然後將具體的工作交給各個子系統去完成。如此一來,可以簡化介面的呼叫。其本質就是將系統與客戶端互動的地方封裝起來。這個模式,總體來說,很簡單,理解起來也不困難。依...
設計模式之外觀模式
外觀模式 為子系統中的一組介面提供乙個一直的介面,此模式定義了乙個高層介面,這個介面使得這一子系統更加容易使用。即通過乙個中類來完成客戶端的請求。拿機房收費系統的上機過程來說,上機需要顯示上機者的資訊,填寫上機狀態表,填寫上機記錄表。而使用者不需要知道這些功能是怎麼實現的,只需要通過介面操作就可以完...
設計模式之外觀模式
外觀模式,為子系統中的一組介面提供乙個一致的介面,此模式定義了乙個高層介面,這個介面使得這一子系統更加容易使用。在設計初期階段,應該要有意識的將不同的兩個層分離,比如經典的三層架構,層與層之間建立外觀facade。在開發階段,子系統往往因不斷的重構演化而變得越來越複雜,增加外觀模式可以提供乙個簡單的...