外觀模式(Facade)

2021-08-31 22:30:46 字數 1849 閱讀 4627

外觀模式(facade)

還是從《head first design patterns》中的例子說起(我重新整理了那個例子),

例子是這樣描述的,說是美國有很多人搞家庭影院(我考慮一種最簡單的方式,也就是全部是開啟和關閉),

而燈光呢可以關閉燈光,開啟燈光,

投影機呢,可以開啟和關閉投影機,

螢幕呢,也可以開啟和關閉,

功放機的話,關閉音量,開啟音量,

以最普通的方式來實現**電影的話,估計類圖會如下所示:

然後我要開啟看電影的話,我必須在客戶端執行下面的操作,

在經歷了這麼多操作後,您才可以看一場電影(看得多不爽啊,居然這麼多操作,太複雜了),

哦,這是太複雜了!!!

在客戶端居然有那麼多操作(問題是還有一些使用者可能不知道如何使用其中的乙個工具那他便看不了電影),

使用者簡直會煩死去!!!

上面其實反映的是乙個現今軟體開發系統中的乙個比較常見的現象,

那就是客戶端程式經常和複雜系統的內部子系統產生直接聯絡,而導致客戶程式隨著子系統的變化而變化。

而上面的例子中呢,客戶端程式便是使用者的操作,而複雜系統的內部子系統代表的就是這些工具的一些使用介面。

上面的例子中我還只是使用了最簡單的工具操作介面,即簡單的開啟和關閉,

如果在子系統,即各個工具中還有新的功能的話呢?

那麼必然會導致客戶端**得變化。

要想解決上面的這一串問題,

你必須要簡化客戶程式與子系統之間的互動介面(要使得不會使用所有工具的使用者也可以實現**電影),

然後就是要解除客戶程式和子系統之間的耦合,而外觀模式正好可以解決這個問題。

外觀模式(facade)的定義

為子系統中的一組介面提供乙個一致的介面,用來訪問子系統中的一群介面,

此模式定義了乙個高層的介面,這個介面使得這一子系統更加容易使用。

簡單的說,就是外觀模式將乙個或者多個類的複雜的操作進行了隱藏,只顯示出乙個一致的介面供客戶端使用。

還有需要注意的是,外觀模式僅僅是給你提供了更為直接和容易的操作方式,它並沒有把原來的子系統進行隔離,

所以,如果你還需要子系統類的更高層的功能,還是可以使用原來的子系統的,這個是外觀模式的一大優點。

同時,通過外觀模式可以子系統的多個介面上建立乙個高層介面,並且將這個高層介面提供給客戶端使用,

這樣便可以解除掉客戶端和複雜子系統之間的耦合。

同時,外觀模式也可以使我們遵循迪公尺特法則(也就是最小知識原則)。

過外觀模式可以實現提供簡單的介面(openmovie 和 closemovie)給客戶端,

也給客戶端和子系統之間實現了解耦。

facade乙個典型應用就是資料庫jdbc的應用(這裡就不舉例了)

舉個例子

我們把乙個檔案,放在了第二抽屜裡,而第二個抽屜的鑰匙放在了第乙個抽屜裡,我們要想取出這個檔案,第一步肯定要拿到第乙個抽屜的鑰匙,然後開啟它再拿出第二個抽屜的鑰匙,最後開啟第二個抽屜取出檔案。(兩個抽屜還好說,但如果是n個呢?)所以對於客戶來說,這些取鑰匙的過程不需要知道,他們只需要按乙個按鈕,然後檔案就自動取出來。**例子如下:

public class drawerone

public void getkey()

}public class drawertwo

public void getfile()

}//這就是外觀類,對客戶隱藏了所有具體細節

//client類只需要呼叫乙個open()就完成所有操作

public class drawe***cade

}public class client

}輸出結果:

第乙個抽屜被開啟了

得到第二個抽屜的鑰匙

第二個抽屜被開啟了

得到這個重要檔案

外觀模式(Facade)

外觀模式的定義是,為子系統中的一組介面提供乙個一致的inte ce介面介面。外觀模式是個很簡單,但很重要的模式,它主要思想是將表現層和邏輯層隔離,封裝底層的複雜處理,只為使用者提供簡單的介面,這樣的例子隨處可見。外觀模式也叫門面模式,它很多時候更是一種系統架構的設計,在我所做的專案中,就實現了門面模...

Facade外觀模式

facade外觀模式,是一種結構型模式,它主要解決的問題是 元件的客戶和元件中各種複雜的子系統有了過多的耦合,隨著外部客戶程式和各子系統的演化,這種過多的耦合面臨很多變化的挑戰。facade設計模式更注重從架構的層次去看整個系統,而不是單個類的層次。facade外觀模式,是一種結構型模式,它主要解決...

Facade外觀模式

facade外觀模式,是一種結構型模式,它主要解決的問題是 元件的客戶和元件中各種複雜的子系統有了過多的耦合,隨著外部客戶程式和各子系統的演化,這種過多的耦合面臨很多變化的挑戰。在這裡我想舉乙個例子 比如,現在有一輛汽車,我們 客戶程式 要啟動它,那我們就要發動引擎 子系統1 使四個車輪 子系統2 ...