爲子系統的一組接口提供一個一致的界面,定義了一個高層接口,這個接口使得這一子系統更容易使用。3d
一、若是你但願爲一個複雜的子系統提供一個簡單接口的時候代理
二、若是想要讓客戶程序和抽象類的實現部分鬆散耦合cdn
三、若是構建多層結構的系統對象
將一個類的接口轉換成 客戶但願的另一個接口。使得本來因爲接口不兼容的類能夠一塊兒工做。blog
Target:定義客戶端須要的跟特定領域相關的接口。繼承
Adaptee:已經存在的接口,一般能知足客戶端的功能要求,可是接口與客戶端要求的特定領域接口不一致,須要被適配。接口
Adapter:適配器,把Adaptee適配成爲Client須要的Target。內存
一、若是你想要使用一個已經存在的類,可是它的接口不符合你的需求get
二、若是你想建立一個能夠複用的類,這個類可能和一些不兼容的類一塊兒工做it
三、若是你想使用一些已經存在的子類,可是不可能對每個子類都進行適配
將抽象部分與它的實現部分分離,使它們均可以獨立地變化。
RefinedAbstraction:擴展抽象部分的接口,一般在這些對象裏面,定義跟實際業務相關的方法,這些方法的實現一般會使用Abstraction中定義的方法,也可能須要調用實現部分的對象來完成。
Implementor:定義實現部分的接口,這個接口不用和Abstraction裏面的方法一致,一般是由Implementor接口提供基本的操做,而Abstraction裏面定義的是基於這些基本操做的業務方法,也就是說Abstraction定義了基於這些基本操做的較高層次的操做。
ConcreteImplementor:真正實現Implementor接口的對象。
一、若是你不但願在抽象和實現部分採用固定的綁定關係,能夠採用橋接模式,來把抽象和實現部分分開,而後在程序運行期間來動態的設置抽象部分須要用到的具體的實現,還能夠動態切換具體的實現。
二、若是出現抽象部分和實現部分都應該能夠擴展的狀況,能夠採用橋接模式,讓抽象部分和實現部分能夠獨立的變化,從而能夠靈活的進行單獨擴展,而不是攪在一塊兒,擴展一邊會影響到另外一邊。
三、若是但願實現部分的修改,不會對客戶產生影響,能夠採用橋接模式,客戶是面向抽象的接口在運行,實現部分的修改,能夠獨立於抽象部分,也就不會對客戶產生影響了,也能夠說對客戶是透明的。
四、若是採用繼承的實現方案,會致使產生不少子類,對於這種狀況,能夠考慮採用橋接模式,分析功能變化的緣由,看看是否能分離成不一樣的緯度,而後經過橋接模式來分離它們,從而減小子類的數目。
將對象組合成屬性結構以表示「部分-總體」的層次結構,組合模式使得用戶對單個對象和組合對用的使用具備一致性。
Leaf:葉子節點對象,定義和實現葉子對象的行爲,再也不包含其它的子節點對象。
Composite:組合對象,一般會存儲子組件,定義包含子組件的那些組件的行爲,並實如今組件接口中定義的與子組件有關的操做。
Client:客戶端,經過組件接口來操做組合結構裏面的組件對象。
一、若是你想表示對象的部分-總體層次結構,能夠選用組合模式,把總體和部分的操做統一塊兒來,使得層次結構實現更簡單,從外部來使用這個層次結構也簡單;
二、若是你但願統一的使用組合結構中的全部對象,能夠選用組合模式,這正是組合模式提供的主要功能;
動態的給一個對象添加一些額外的職責。就增長功能來講,裝飾模式比生成子類更靈活。
Decorator:全部裝飾器的抽象父類,須要定義一個與組件接口一致的接口,並持有一個Component對象,其實就是持有一個被裝飾的對象。注意,這個被裝飾的對象不必定是最原始的那個對象了,也多是被其它裝飾器裝飾事後的對象,反正都是實現的同一個接口,也就是同一類型。
ConcreteDecorator:實際的裝飾器對象,實現具體要向被裝飾對象添加的功能。
一、若是須要在不影響其它對象的狀況下,以動態、透明的方式給對象添加職責
二、若是不合適使用子類來進行擴展的時候
運用共享技術有效地支持大量細粒度的對象。
ConcreteFlyweight:具體的享元實現對象,必須是可共享的,須要封裝flyweight的內部狀態。
UnsharedConcreteFlyweight:非共享的享元實現對象,並非全部的Flyweight實現對象都須要共享。非共享的享元實現對象一般是對共享享元對象的組合對象。
FlyweightFactory:享元工廠,主要用來建立並管理共享的享元對象,並對外提供訪問共享享元的接口。
Client:享元客戶端,主要的工做是維持一個對flyweight的引用,計算或存儲享元對象的外部狀態,固然這裏能夠訪問共享和不共享的flyweight對象。
一、若是一個應用程序使用了大量的細粒度對象,可使用享元模式來減小對象數量;
二、若是因爲使用大量的對象,形成很大的存儲開銷,可使用享元模式來減小對象數量,並節約內存;
若是對象的大多數狀態均可以轉變爲外部狀態,好比經過計算獲得,或是從外部傳入等,可使用享元模式來實現內部狀態和外部狀態的分離; 若是不考慮對象的外部狀態,能夠用相對較少的共享對象取代不少組合對象,可使用享元模式來共享對象,而後組合對象來使用這些共享對象;
爲其餘對象提供一種代理以控制對這個對象的訪問。
實現與具體的目標對象同樣的接口,這樣就可使用代理來代替具體的目標對象
保存一個指向具體目標對象的引用,能夠在須要的時候調用具體的目標對象,能夠控制對具體目標對象的訪問,並可能負責建立和刪除它
Subject:目標接口,定義代理和具體目標對象的接口,這樣就能夠在任何使用具體目標對象的地方使用代理對象
RealSubject:具體的目標對象,真正實現目標接口要求的功能。
須要爲一個對象在不一樣的地址空間提供局部表明的時候,可使用遠程代理;
須要按照須要建立開銷很大的對象的時候,可使用虛代理;
須要控制對原始對象的訪問的時候,可使用保護代理;
須要在訪問對象的時候執行一些附加操做的時候,可使用智能指引代理;