戲說設計模式(一)外觀模式

2021-07-24 21:43:09 字數 2479 閱讀 4466

我發明了乙個可以做菜的機器,它有乙個選單,可以給你做選單裡菜餚,如你選擇選單裡的西紅柿炒蛋,它就會給你來一盤西紅柿炒蛋。你以為我在講真?開玩喜,我只是想用這個例子講一下外觀模式(facade)

天生我才必有用,外觀模式也不例外。在介紹外觀模式前,得先說一下出現的問題。

如我開頭講的那個機器,是不是很好用。試想一下如果沒有那個機器,如果要做乙個西紅柿炒蛋,你就要處理西紅柿、雞蛋一頓辛苦爆炒才能得到你要的菜餚。而有了那個機器,你只要輕鬆一步就搞定。不過如果你要甜味的西紅柿炒蛋,就不能使用該機器了,因為該機器的選單上並沒有這個菜(因為比較少人吃),還是要乙個乙個處理材料然後一頓辛苦爆炒。

說到這裡,大家可能有點意識了,沒錯,我發明那個機器就是相當於採用了外觀模式,而那個機器就是外觀

在乙個大一點工程裡,會有很多子系統,為了提供復用性,我們會不斷細化,然後將子系統又分成若干模組(module)。這些模組各有各的職責,我們把呼叫該子系統中模組功能的程式視為客戶端。可能很多時候客戶端會頻繁呼叫多個模組的功能,而且每次都是這幾個。結構圖如下:

比如說有個人喜歡西紅柿炒蛋,那麼他就會頻繁地用西紅柿和雞蛋,結構圖變成了這樣子:

這樣子的話,就好麻煩了,所以就有了外觀模式,就有了我發明的機器。我們可以做乙個外觀類,在外觀類裡處理和整合幾個常用的模組功能,然後客戶端直接呼叫外觀類提供的方法。此時結構圖如下:

如果是我的例子的話,結構圖就是這個樣子

通過上面的例子,大家可以發現,使用了外觀模式,就可以減少客戶端與子系統內各個模組的互動,降低了耦合度,讓客戶端更方便地使用子系統,並且隱藏了子系統的內部細節

現在我簡單說一下,假設我的乙個子系統是菜籃,然後西紅柿和雞蛋是菜籃裡面的一部分也就是模組。很明顯,西紅柿提供西紅柿,雞蛋提供雞蛋~我就是客戶端,如果我要做西紅柿炒蛋的話就要從菜籃中得到西紅柿和炒蛋。下面就用**實現。

西紅柿類

public

class tomato

}

雞蛋類

public

class egg

}

public

class fatman

}

結果

我是西紅柿,盡情享用吧~

我是雞蛋,盡情享用吧~

看,我要分別呼叫兩個方法,萬一我要吃的不是西紅柿炒蛋,而是西紅柿炒蛋炒雞肉炒豬肉炒番薯炒土豆。。。呢,萬一我女朋友也很喜歡這樣子吃呢,我豈不是每次都要搞這麼多事。我是個懶人,不想搞這麼多事,於是我發明了乙個機器。

西紅柿類和雞蛋類還是那樣,但是我發明了乙個機器類,來幫我幹活,減輕我負擔

機器類

public

class machine

}

這時候我就方便多了

public

class fatman

}

結果

我是西紅柿,盡情享用吧~

我是雞蛋,盡情享用吧~

看完上面的描述,大家可能對外觀模式有點認識了,不過有一點要注意一下。過多或者不太合理的外觀也容易讓人迷惑。到底是呼叫外觀好呢,還是直接呼叫模組好?

其實並不是說用了外觀模式,就一定要通過外觀來訪問子系統中的模組功能,其實客戶端也可以直接呼叫子系統中的模組功能,外觀只是把比較平常比較多人用的模組功能整合一起,減少客戶端與子系統中的耦合,也可以讓客戶端呼叫方便。但是有些不太常用的功能,還是不會定義到外觀中的,這時候就可以直接呼叫子系統的模組功能。番茄炒蛋很常見所以定義在外觀中,但是番茄炒豬肉就不常見了吧,所以這時候就要分別呼叫番茄和羊肉了。

簡單一句話描述外觀模式

封裝互動,簡化呼叫

如果上面的內容有錯誤的地方或者講的不好的地方,還請大家指點一下,我好及時修改。

設計模式 外觀模式

外觀模式,我的理解就是將複雜的類進行重新封裝,將簡單的介面呈現出來,降低呼叫端和實際類的耦合性。拿 大話設計模式 上邊關於 和 的例子來說。對於不入門的股民來說,交易有些過於龐大,需要學習的東西很多,如果沒整明白就進行投資,很容易賠錢的。很多剛入 的股民都賠的很慘。而買 有提出了乙個新的觀念,我們買...

設計模式 外觀模式

何為外觀模式?外觀模式 為子系統中的一組介面提供乙個一致的介面,此模式定義了乙個高層介面,這個介面使得一子系統更加容易使用。它是一種結構型模式,它主要解決的問題是 元件的客戶和元件中各種複雜的子系統有了過多的耦合,隨著外部客戶程式和 各子系統的演化,這種過多的耦合面臨很多變化的挑戰。uml類圖 乙個...

設計模式 外觀模式

外觀模式說白了就是為一組介面提供乙個一致的介面。例如 定義三個類a b c,每個類各定義乙個方法。class a pubic void showa cout a showa pubic void showb cout b showb pubic void showc cout c showc 定義乙...