天天看點

Java設計模式之七大結構型模式

總體來說設計模式分為三大類:建立型模式、結構型模式和行為型模式。

結構型模式,共有七種:擴充卡模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式。

其中擴充卡模式主要分為三類:類的擴充卡模式、對象的擴充卡模式、接口的擴充卡模式。其中的對象的擴充卡模式是各種結構型模式的起源。

擴充卡模式主要分為三類:類的擴充卡模式、對象的擴充卡模式、接口的擴充卡模式。

擴充卡模式将某個類的接口轉換成用戶端期望的另一個接口表示,目的是消除由于接口不比對所造成的類的相容性問題。有點抽象,我們來看看詳細的内容。

類的擴充卡模式核心思想就是:有一個Source類,擁有一個方法,待适配,目标接口是Targetable,通過Adapter類,将Source的功能擴充到Targetable裡。

運作結果如下:

對象的擴充卡模式的基本思路和類的擴充卡模式相同,隻是将Adapter類作修改成Wrapper,這次不繼承Source類,而是持有Source類的執行個體,以達到解決相容性的問題。

運作結果跟類的擴充卡模式例子的一樣。

接口的擴充卡是這樣的:有時我們寫的一個接口中有多個抽象方法,當我們寫該接口的實作類時,必須實作該接口的所有方法,這明顯有時比較浪費,因為并不是所有的方法都是我們需要的,有時隻需要某一些,此處為了解決這個問題,我們引入了接口的擴充卡模式,借助于一個抽象類,該抽象類實作了該接口,實作了所有的方法,而我們不和原始的接口打交道,隻和該抽象類取得聯系,是以我們寫一個類,繼承該抽象類,重寫我們需要的方法就行了。

裝飾模式:在不必改變原類檔案和使用繼承的情況下,動态地擴充一個對象的功能。它是通過建立一個包裝對象,也就是裝飾來包裹真實的對象。

裝飾模式的特點:

裝飾對象和真實對象有相同的接口。這樣用戶端對象就能以和真實對象相同的方式和裝飾對象互動。

裝飾對象包含一個真實對象的引用(reference)

裝飾對象接受所有來自用戶端的請求。它把這些請求轉發給真實的對象。

裝飾對象可以在轉發這些請求以前或以後增加一些附加功能。這樣就確定了在運作時,不用修改給定對象的結構就可以在外部增加附加的功能。在面向對象的設計中,通常是通過繼承來實作對給定類的功能擴充。繼承不能做到這一點,繼承的功能是靜态的,不能動态增删。

代碼如下:

======以上為建立型模式的兩種設計模式,下面陸續記錄代理等建立型模式。

為什麼叫建立型模式呢?

開閉原則:對擴充開放,對修改關閉

裡氏替換原則:面向對象設計的基本原則之一。==任何基類可以出現的地方,子類一定可以出現。==LSP是繼承複用的基石,隻有當衍生類可以替換掉基類。

依賴倒轉原則:針對接口程式設計,依賴于抽象而不是具體。

接口隔離原則:使用多個隔離的接口,比使用單個接口要好。還是一個降低類之間的耦合度的意思。【降低依賴,降低耦合】

迪米特法則(最少知道原則):一個實體應當盡量少的與其它實體之間發生互相作用,使得系統功能子產品相對獨立。

合成複用原則:意思是盡量使用合成聚合的方式,而不是使用繼承。

回過頭解釋為什麼叫建立型設計模式。建立型設計模式就是處理對象建立的設計模式,試圖根據實際情況使用合适的方式建立對象。基本的對象建立方式可能會導緻設計上的問題,或增加設計的複雜度。建立型模式通過以某種方式控制對象的建立來解決問題。

建立型模式由兩個主導思想構成。一是将系統使用的具體類封裝起來,二是隐藏這些具體類的執行個體建立和結合的方式。
建立型模式又分為對象建立型模式和類建立型模式。對象建立型模式處理對象的建立,類建立型模式處理類的建立。詳細地說,對象建立型模式把對象建立的一部分推遲到另一個對象中,而類建立型模式将它對象的建立推遲到子類中。[2]

參考:

<a href="http://www.importnew.com/18429.html">Java經典設計模式(2):七大結構型模式</a>

<a href="http://blog.csdn.net/u013142781/article/details/50821155">CSDN:七大結構型模式</a>

<a href="http://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/factory_method.html#id2">圖解設計模式</a>

<a href="http://www.importnew.com/21445.html">面試總結</a>