天天看點

23種設計模式介紹(二)---- 結構型模式

概述

  結構型模式共七種:

擴充卡模式(Adapter)        

外觀模式(Facade)

橋接模式(Bridge)

裝飾器模式(Decorator)

代理模式(Proxy)

享元模式(Flyweight)

組合模式(Composite)

  其中又分為

  接口适配:擴充卡、外觀、橋接模式

  行為擴充:裝飾

  性能與對象通路:代理、享元模式

  抽象集合:組合模式

  定義:将一個類的接口轉換成客戶希望的另外一個接口,Adapter模式使得原本由于接口不相容而不能一起工作的那些類可以一起工作。

  角色:擴充卡(Adapter)、被适配類、對象(Adaptee)

  了解:客戶需要Target,現實隻有Adaptee,可以用一個實作Target協定的擴充卡通過類繼承或者對象組合類獲得被Adaptee。

  類圖:

  

23種設計模式介紹(二)---- 結構型模式

  例子代碼: 

  定義:為子系統中一組不同的接口提供統一的接口

  什麼時候用:1.子系統正逐漸變得複雜,應用模式的過程中演化出許多類。可以使用外觀為這些子系統類提供一個較簡單的接口。2.可以使用外觀對子系統分層,每個字系統級别有一個外觀做為入口。讓她們通過外觀進行通信,可以簡化他們的依賴關系。

23種設計模式介紹(二)---- 結構型模式

  定義:将抽象部分與它的實作部分分離,使它可以獨立的變更

  角色:抽象層接口(Abstraction)、具體抽象層、實作者接口、具體實作者。

  了解:這裡有兩個接口,一個是抽象層接口Abstraction,一個是Implementor接口,其中Abstraction持有Implementor的引用。用戶端通過Abstraction來連接配接Implementor,以後Implementor可以動态的改變而不影響Abstraction。  

  什麼時候用:1.不想在抽象與實作之間形成固定的綁定關系(這樣就能在運作時切換實作)。2.抽象與實作都應可以通過子類化獨立進行擴充。

3.對抽象的實作進行修改不應影響用戶端代碼。4.如果每個實作需要額外的子類以細化抽象,則說明有必要把它們分成兩個部分。5.想在帶有不同抽象接口的多個對象之間共享一個實作。

23種設計模式介紹(二)---- 結構型模式

  定義:動态的給對象添加一些額外的責任,就增加功能來說,裝飾比生成子類更為靈活。

  角色:元件接口(Component)、具體的元件、繼承至Component的修飾接口(Decorator)、具體的修飾

  了解:修飾接口Decorator繼承Component,并持有Component的一個引用,是以起到了複用Component并增加新的功能。

  什麼時候用:1.想要在不影響其他對象的情況下,以動态、透明的方式給單個對象添加職責。2.想要擴充一個類的行為,卻做不到。類定義可能被隐藏,無法進行子類化;或者對類的每個行為的擴充,哦支援每種功能組合,将産生大量的子類。

23種設計模式介紹(二)---- 結構型模式

參考:Java設計模式之代理模式(靜态代理和JDK、CGLib動态代理)以及應用場景  

定義:為其他對象提供一種代理以控制對這個對象的通路

  角色:用戶端(Client)、目标接口(subject)代理對象(Proxy)、真正的目标對象(RealSubject)

  虛拟代理:用戶端擁有Subject的引用,其實就是Proxy對象,Proxy對象持有RealSubject的引用,調用Proxy.request   Proxy會實際調用RealSubject.request類

靜态代理 簡單的例子:

  定義:将對象組合成樹形結構以表示’部分-整體’的層次結構。組合模式使得使用者對單個對象群組合對象的使用具有一緻性。

  了解:組合模式讓我們可以把相同的基類型的對象組合到樹狀結構中,其中父節點包含同類型的子節點。

  什麼時候用:1.想獲得對象抽象的樹形表示(部分-整體層次結構)。2.想讓用戶端統一處理組合結構中的所有對象。

23種設計模式介紹(二)---- 結構型模式

  定義:運用共享技術有效地支援大量細粒度的對象。

  角色:享元池、享元接口、具體享元對象

  了解:用戶端需要享元對象時,先去享元池尋找,如果找到了就直接複用,如果沒有找到就建立享元對象并儲存到享元池。

23種設計模式介紹(二)---- 結構型模式
23種設計模式介紹(二)---- 結構型模式

 參考:

23種設計模式介紹(一)---- 建立型模式

23種設計模式介紹(二)---- 結構型模式

23種設計模式介紹(三)---- 行為型模式