我將從façade
模式開始學習設計模式,或許此前你已經實現過該模式,但卻沒有為它取乙個名字。
在本章,
l我解釋什麼是
façade
模式以及在**使用它。
l我介紹
façade
模式的關鍵特性。
l我介紹
façade
模式的一些變種。
l我將
façade
模式和cad/cam
問題關聯起來。
依據四人團的意思,
façade
模式的意圖是:
「為子系統中的一組介面提供乙個統一的介面。
façade
定義了乙個更高層次的介面,使得子系統更加容易使用。」
基本上,這就是說我們需要乙個新的方法去和乙個系統互動,該方法比當前的方法更加容易,或者我們需要以一種特殊的方式來使用系統(例如以二維的方式來使用乙個三維的繪圖程式)。我們之所以能夠構建這樣的互動方法,是因為對於我們所討論的這個系統,我們只需要使用它的乙個子集。
有一次,我以承包人的身份為一家大型工程製造公司工作。在我上班的第一天,專案的技術領導沒有來。現在,這個客戶不想按小時來支付我的薪水,也沒有任何事情讓我做。他們希望我在做些什麼,即便它沒有任何用處!難道你沒有體驗過這樣的日子嗎?
於是,乙個專案成員發現了我可以做的事情。她說,「在未來的某個時候,你將不得不學習我們使用的這個
cad/cam
系統,因此你最好現在就開始,從這邊的這些手冊開始。」於是她把我帶到那組文件前面。我可以毫不誇張地說:有
8英呎的手冊等著我去閱讀
……每頁
8.5×
11英吋,並且還是小字型!這是乙個複雜的系統!
圖6-1 8
英呎的手冊=
乙個複雜的系統!
現在,如果你和我,並且假設還有另外四五個人在乙個需要使用這個系統的專案中,不是我們所有的人都必須學習整個系統。為了不浪費每個人的時間,我們可能會抽籤,輸家將不得不寫程式,而其他的人則使用它來和系統互動。
這個人將決定我和團隊中的其他成員如何使用系統,以及什麼樣的
api最適合我們的特殊需求。接下來她將會建立乙個或多個新的類,後者擁有我們所需要的介面。這樣,我和其他的程式設計師就可以使用這個新的介面而不需要完整地學習這個複雜的系統(見圖
6-2)。
圖6-2
將客戶與子系統隔離開來
現在,這種方法僅僅在使用系統能力的乙個子集或者以一種特殊方式和系統互動的時候有效。如果系統中的每一樣東西都需要被使用,那麼我將不可能提出乙個簡單的介面(除非原先的設計人員做得很糟糕)。
這就是façade
模式。它使得我們更加容易地使用乙個複雜的系統,要麼僅僅使用系統的乙個子集,要麼以一種特殊的方式來使用系統。我們擁有乙個複雜的系統,我們只需要使用它的一部分。我們最終將得到乙個更簡單的、更容易使用的系統,或是乙個針對我們的需求而定製的系統。
大部分的工作仍舊需要由底層系統來完成。
façade
提供一組更加容易理解的方法。這些方法使用底層系統實現新定義的功能。
façade
模式:關鍵特性
意圖
你想要簡化乙個現有系統的使用。你需要定義你自己的介面。
問題
你只需要使用複雜系統的乙個子集,或者你需要以一種特殊方式和系統互動。
方案
façade
給現有系統的客戶乙個新的介面去使用。
參與者和協作者
它給客戶乙個專門的介面,這使得它更容易使用。
結果
façade
簡化了必需的子系統的使用。不過,由於
facede
是不完整的,某些功能對客戶可能不可用。
實現
l定義乙個(或幾個)新類,後者擁有必需的介面。
l
讓這個新類使用現有系統。
gof參考
185-193
頁。
圖6-3 façade
模式標準的、簡化的檢視
façade
不僅可用於通過方法呼叫建立乙個更簡單的介面,還能減少乙個客戶物件必須處理的物件的數目。例如,假設我有乙個必須處理資料庫、模型和元素的客戶物件。該客戶必須首先開啟資料庫並獲取乙個模型;接著,它查詢這個模型得到乙個元素;最後,它向這個元素請求資訊。如果我們建立乙個能被客戶查詢的資料庫
façade
,那麼情況就會簡單得多(見圖
6-4)。
圖6-4 façade
為客戶減少物件數目
假設除了使用系統中已有的功能以外,我還需要提供一些新的功能。那麼我要面對的就不再是乙個簡單的系統子集了。
此時,我為
façade
類寫的方法將會被新的程式實現以提供新的功能。這仍然是
façade
模式,但是已被擴充套件了新的功能。
façade
模式提出了大體途徑,它讓我有了乙個起點。該模式的外表部分是我正在建立乙個新的介面給客戶使用而不是使用現有系統介面的事實。我能夠這樣做是因為客戶物件不需要使用原始系統中的全部功能。
模式提出了大體途徑
乙個模式僅僅設定了大體途徑。是否增加新的功能取決於當前的情況。模式是藍圖,是起點而不是終點。
façade
也能用於隱藏或者封裝系統。
façade
能夠包含系統作為
façade
類的私有成員。此時,原始系統將會和
façade
類一起連線進去,但該系統對
façade
類的使用者卻不可見。
有許多封裝系統的理由:
l跟蹤系統使用
——通過迫使所有對系統的訪問都流經
façade
,我可以很容易地監視系統使用。
l換出系統
——將來我可能需要換出系統。通過將原始系統作為
façade
類的乙個私有成員,我只需花最小的代價換用乙個新的系統。雖然工作量有可能仍然很大,但至少我將只需要在乙個地方改變**(
façade
類)。思考上面的例子。
façade
模式會有助於諸如
v1slots
、v1holes
之類的類來使用
v1system
。在第12
章「用模式解決
cad/cam
問題」中的解決方案中,我將會這樣做。
façade
模式之所以被這樣命名是因為它在原始系統的前面放置了乙個新的前端(外表)。
façade
模式適用於以下時候:
l你不需要使用乙個複雜系統的全部功能,並且能夠建立乙個新類,它包含了所有訪問該系統的全部規則。如果正如通常情況一樣,這是原始系統的乙個子集,那麼你在新類中建立的
api應該會比原始系統中的
api簡單很多。
l你需要封裝或者隱藏原始系統。
l你需要使用原始系統的功能,並且同時想要增加一些新的功能。
l寫這個新類的代價小於每個人學習如何使用原始系統的代價,或者小於將來你在維護上可能花費的代價。
《設計模式解析》第6章 Facade(外表)模式
我將從fa ade 模式開始學習設計模式,或許此前你已經實現過該模式,但卻沒有為它取乙個名字。在本章,l我解釋什麼是 fa ade 模式以及在 使用它。l我介紹 fa ade 模式的關鍵特性。l我介紹 fa ade 模式的一些變種。l我將fa ade 模式和cad cam 問題關聯起來。依據四人團的...
facade設計模式
facade 外 觀模式,是一種結構型模式,它主要解決的問題是 元件的客戶和元件中各種複雜的子系統有了過多的耦合,隨著外部客戶程式和各子系統的演化,這種過多的耦合 面臨很多變化的挑戰。在這裡我想舉乙個例子 比如,現在有一輛汽車,我們 客戶程式 要啟動它,那我們就要發動引擎 子系統 1 使四個車輪 子...
Facade設計模式
facade模式也叫外觀模式,是由gof提出的23種設計模式中的一種。facade模式為一組具有類似功能的類群,比如類庫,子系統等等,提供乙個一致的簡單的介面。這個一致的簡單的介面被稱作facade。本文介紹設計模式中的外觀 facade 模式的概念,用法,以及實際應用中怎麼樣使用facade模式進...