設計模式-結構型

7、外觀模式(Facade)

一、定義

爲子系統的一組接口提供一個一致的界面,定義了一個高層接口,這個接口使得這一子系統更容易使用。3d

二、類圖

三、調用順序

四、代碼示例

五、什麼時候選用外觀模式

一、若是你但願爲一個複雜的子系統提供一個簡單接口的時候代理

二、若是想要讓客戶程序和抽象類的實現部分鬆散耦合cdn

三、若是構建多層結構的系統對象

8、適配器(Adapter)

一、定義

將一個類的接口轉換成 客戶但願的另一個接口。使得本來因爲接口不兼容的類能夠一塊兒工做。blog

二、類圖

Client:客戶端,調用本身須要的領域接口Target。

Target:定義客戶端須要的跟特定領域相關的接口。繼承

Adaptee:已經存在的接口,一般能知足客戶端的功能要求,可是接口與客戶端要求的特定領域接口不一致,須要被適配。接口

Adapter:適配器,把Adaptee適配成爲Client須要的Target。內存

三、代碼示例

四、什麼時候選用適配器模式

一、若是你想要使用一個已經存在的類,可是它的接口不符合你的需求get

二、若是你想建立一個能夠複用的類,這個類可能和一些不兼容的類一塊兒工做it

三、若是你想使用一些已經存在的子類,可是不可能對每個子類都進行適配

9、橋接模式(Bridge)

一、定義

將抽象部分與它的實現部分分離,使它們均可以獨立地變化。

二、類圖

Abstraction:抽象部分的接口。一般在這個對象裏面,要維護一個實現部分的對象引用,在抽象對象裏面的方法,須要調用實現部分的對象來完成。這個對象裏面的方法,一般都是跟具體的業務相關的方法。

RefinedAbstraction:擴展抽象部分的接口,一般在這些對象裏面,定義跟實際業務相關的方法,這些方法的實現一般會使用Abstraction中定義的方法,也可能須要調用實現部分的對象來完成。

Implementor:定義實現部分的接口,這個接口不用和Abstraction裏面的方法一致,一般是由Implementor接口提供基本的操做,而Abstraction裏面定義的是基於這些基本操做的業務方法,也就是說Abstraction定義了基於這些基本操做的較高層次的操做。

ConcreteImplementor:真正實現Implementor接口的對象。

三、調用順序

四、示例代碼

五、什麼時候選用橋接模式

一、若是你不但願在抽象和實現部分採用固定的綁定關係,能夠採用橋接模式,來把抽象和實現部分分開,而後在程序運行期間來動態的設置抽象部分須要用到的具體的實現,還能夠動態切換具體的實現。

二、若是出現抽象部分和實現部分都應該能夠擴展的狀況,能夠採用橋接模式,讓抽象部分和實現部分能夠獨立的變化,從而能夠靈活的進行單獨擴展,而不是攪在一塊兒,擴展一邊會影響到另外一邊。

三、若是但願實現部分的修改,不會對客戶產生影響,能夠採用橋接模式,客戶是面向抽象的接口在運行,實現部分的修改,能夠獨立於抽象部分,也就不會對客戶產生影響了,也能夠說對客戶是透明的。

四、若是採用繼承的實現方案,會致使產生不少子類,對於這種狀況,能夠考慮採用橋接模式,分析功能變化的緣由,看看是否能分離成不一樣的緯度,而後經過橋接模式來分離它們,從而減小子類的數目

10、組合模式(Composite)

一、定義

將對象組合成屬性結構以表示「部分-總體」的層次結構,組合模式使得用戶對單個對象和組合對用的使用具備一致性。

二、類圖

Component:抽象的組件對象,爲組合中的對象聲明接口,讓客戶端能夠經過這個接口來訪問和管理整個對象結構,能夠在裏面爲定義的功能提供缺省的實現。

Leaf:葉子節點對象,定義和實現葉子對象的行爲,再也不包含其它的子節點對象。

Composite:組合對象,一般會存儲子組件,定義包含子組件的那些組件的行爲,並實如今組件接口中定義的與子組件有關的操做。

Client:客戶端,經過組件接口來操做組合結構裏面的組件對象。

三、示例代碼

四、什麼時候選用組合模式

一、若是你想表示對象的部分-總體層次結構,能夠選用組合模式,把總體和部分的操做統一塊兒來,使得層次結構實現更簡單,從外部來使用這個層次結構也簡單;

二、若是你但願統一的使用組合結構中的全部對象,能夠選用組合模式,這正是組合模式提供的主要功能;

十一裝飾者(Decorator)

一、定義

動態的給一個對象添加一些額外的職責。就增長功能來講,裝飾模式比生成子類更靈活。

二、類圖

Component:組件對象的接口,能夠給這些對象動態的添加職責。 ConcreteComponent:具體的組件對象,實現組件對象接口,一般就是被裝飾器裝飾的原始對象,也就是能夠給這個對象添加職責。

Decorator:全部裝飾器的抽象父類,須要定義一個與組件接口一致的接口,並持有一個Component對象,其實就是持有一個被裝飾的對象。注意,這個被裝飾的對象不必定是最原始的那個對象了,也多是被其它裝飾器裝飾事後的對象,反正都是實現的同一個接口,也就是同一類型。

ConcreteDecorator:實際的裝飾器對象,實現具體要向被裝飾對象添加的功能。

三、示例代碼

四、什麼時候選用裝飾模式

一、若是須要在不影響其它對象的狀況下,以動態、透明的方式給對象添加職責

二、若是不合適使用子類來進行擴展的時候

12、享元模式(Flyweight)

一、定義

運用共享技術有效地支持大量細粒度的對象。

二、類圖

Flyweight:享元接口,經過這個接口flyweight能夠接受並做用於外部狀態。經過這個接口傳入外部的狀態,在享元對象的方法處理中可能會使用這些外部的數據。

ConcreteFlyweight:具體的享元實現對象,必須是可共享的,須要封裝flyweight的內部狀態。

UnsharedConcreteFlyweight:非共享的享元實現對象,並非全部的Flyweight實現對象都須要共享。非共享的享元實現對象一般是對共享享元對象的組合對象。

FlyweightFactory:享元工廠,主要用來建立並管理共享的享元對象,並對外提供訪問共享享元的接口。

Client:享元客戶端,主要的工做是維持一個對flyweight的引用,計算或存儲享元對象的外部狀態,固然這裏能夠訪問共享和不共享的flyweight對象。

三、調用順序

四、示例代碼

五、什麼時候選用享元模式

一、若是一個應用程序使用了大量的細粒度對象,可使用享元模式來減小對象數量;

二、若是因爲使用大量的對象,形成很大的存儲開銷,可使用享元模式來減小對象數量,並節約內存;

若是對象的大多數狀態均可以轉變爲外部狀態,好比經過計算獲得,或是從外部傳入等,可使用享元模式來實現內部狀態和外部狀態的分離若是不考慮對象的外部狀態,能夠用相對較少的共享對象取代不少組合對象,可使用享元模式來共享對象,而後組合對象來使用這些共享對象;

十3、代理模式(Proxy)

一、定義

爲其餘對象提供一種代理以控制對這個對象的訪問。

二、類圖

Proxy:代理對象,一般具備以下功能:

  1. 實現與具體的目標對象同樣的接口,這樣就可使用代理來代替具體的目標對象

  2. 保存一個指向具體目標對象的引用,能夠在須要的時候調用具體的目標對象,能夠控制對具體目標對象的訪問,並可能負責建立和刪除它

Subject:目標接口,定義代理和具體目標對象的接口,這樣就能夠在任何使用具體目標對象的地方使用代理對象

RealSubject:具體的目標對象,真正實現目標接口要求的功能。

三、調用順序

四、示例代碼

五、什麼時候選用代理模式

須要爲一個對象在不一樣的地址空間提供局部表明的時候,可使用遠程代理;

須要按照須要建立開銷很大的對象的時候,可使用虛代理;

須要控制對原始對象的訪問的時候,可使用保護代理;

須要在訪問對象的時候執行一些附加操做的時候,可使用智能指引代理;

相關文章
相關標籤/搜索