結(jié)構(gòu)型模式分為以下 7 種:
- 代理(Proxy)模式:為某對(duì)象提供一種代理以控制對(duì)該對(duì)象的訪問。即客戶端通過代理間接地訪問該對(duì)象,從而限制、增強(qiáng)或修改該對(duì)象的一些特性。
- 適配器(Adapter)模式:將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口,使得原本由于接口不兼容而不能一起工作的那些類能一起工作。
- 橋接(Bridge)模式:將抽象與實(shí)現(xiàn)分離,使它們可以獨(dú)立變化。它是用組合關(guān)系代替繼承關(guān)系來(lái)實(shí)現(xiàn)的,從而降低了抽象和實(shí)現(xiàn)這兩個(gè)可變維度的耦合度。
- 裝飾(Decorator)模式:動(dòng)態(tài)地給對(duì)象增加一些職責(zé),即增加其額外的功能。
- 外觀(Facade)模式:為多個(gè)復(fù)雜的子系統(tǒng)提供一個(gè)一致的接口,使這些子系統(tǒng)更加容易被訪問。
- 享元(Flyweight)模式:運(yùn)用共享技術(shù)來(lái)有效地支持大量細(xì)粒度對(duì)象的復(fù)用。
- 組合(Composite)模式:將對(duì)象組合成樹狀層次結(jié)構(gòu),使用戶對(duì)單個(gè)對(duì)象和組合對(duì)象具有一致的訪問性。
代理
訪問對(duì)象不適合或者不能直接引用目標(biāo)對(duì)象,代理對(duì)象作為訪問對(duì)象和目標(biāo)對(duì)象之間的中介。

適配器
將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口,使得原本由于接口不兼容而不能一起工作的那些類能一起工作。

橋接
將抽象與實(shí)現(xiàn)分離,使它們可以獨(dú)立變化。它是用組合關(guān)系代替繼承關(guān)系來(lái)實(shí)現(xiàn)。
主要角色
- 抽象化(Abstraction)角色:定義抽象類,并包含一個(gè)對(duì)實(shí)現(xiàn)化對(duì)象的引用。
- 擴(kuò)展抽象化(Refined Abstraction)角色:是抽象化角色的子類,實(shí)現(xiàn)父類中的業(yè)務(wù)方法,并通過組合關(guān)系調(diào)用實(shí)現(xiàn)化角色中的業(yè)務(wù)方法。
- 實(shí)現(xiàn)化(Implementor)角色:定義實(shí)現(xiàn)化角色的接口,供擴(kuò)展抽象化角色調(diào)用。
- 具體實(shí)現(xiàn)化(Concrete Implementor)角色:給出實(shí)現(xiàn)化角色接口的具體實(shí)現(xiàn)。

裝飾
指在不改變現(xiàn)有對(duì)象結(jié)構(gòu)的情況下,動(dòng)態(tài)地給該對(duì)象增加一些職責(zé)(即增加其額外功能)的模式
通常情況下,擴(kuò)展一個(gè)類的功能會(huì)使用繼承方式來(lái)實(shí)現(xiàn)。但繼承具有靜態(tài)特征,耦合度高,并且隨著擴(kuò)展功能的增多,子類會(huì)很膨脹。如果使用組合關(guān)系來(lái)創(chuàng)建一個(gè)包裝對(duì)象(即裝飾對(duì)象)來(lái)包裹真實(shí)對(duì)象,并在保持真實(shí)對(duì)象的類結(jié)構(gòu)不變的前提下,為其提供額外的功能,這就是裝飾模式的目標(biāo)。
角色:
- 抽象構(gòu)件(Component)角色:定義一個(gè)抽象接口以規(guī)范準(zhǔn)備接收附加責(zé)任的對(duì)象。
- 具體構(gòu)件(Concrete Component)角色:實(shí)現(xiàn)抽象構(gòu)件,通過裝飾角色為其添加一些職責(zé)。
- 抽象裝飾(Decorator)角色:繼承抽象構(gòu)件,并包含具體構(gòu)件的實(shí)例,可以通過其子類擴(kuò)展具體構(gòu)件的功能。
- 具體裝飾(ConcreteDecorator)角色:實(shí)現(xiàn)抽象裝飾的相關(guān)方法,并給具體構(gòu)件對(duì)象添加附加的責(zé)任。

外觀
軟件設(shè)計(jì)也是這樣,當(dāng)一個(gè)系統(tǒng)的功能越來(lái)越強(qiáng),子系統(tǒng)會(huì)越來(lái)越多,客戶對(duì)系統(tǒng)的訪問也變得越來(lái)越復(fù)雜。這時(shí)如果系統(tǒng)內(nèi)部發(fā)生改變,客戶端也要跟著改變,這違背了“開閉原則”,也違背了“迪米特法則”,所以有必要為多個(gè)子系統(tǒng)提供一個(gè)統(tǒng)一的接口,從而降低系統(tǒng)的耦合度,這就是外觀模式的目標(biāo)。

享元
運(yùn)用共享技術(shù)來(lái)有効地支持大量細(xì)粒度對(duì)象的復(fù)用。但需要關(guān)注共享對(duì)象的上下文與狀態(tài)變化
實(shí)現(xiàn)
角色
抽象享元角色(Flyweight):是所有的具體享元類的基類,為具體享元規(guī)范需要實(shí)現(xiàn)的公共接口,非享元的外部狀態(tài)以參數(shù)的形式通過方法傳入。
具體享元(Concrete Flyweight)角色:實(shí)現(xiàn)抽象享元角色中所規(guī)定的接口。
非享元(Unsharable Flyweight)角色:是不可以共享的外部狀態(tài),它以參數(shù)的形式注入具體享元的相關(guān)方法中。享元工廠(Flyweight Factory)角色:負(fù)責(zé)創(chuàng)建和管理享元角色。當(dāng)客戶對(duì)象請(qǐng)求一個(gè)享元對(duì)象時(shí),享元工廠檢査系統(tǒng)中是否存在符合要求的享元對(duì)象,如果存在則提供給客戶;如果不存在的話,則創(chuàng)建一個(gè)新的享元對(duì)象。

組合
它是一種將對(duì)象組合成樹狀的層次結(jié)構(gòu)的模式,用來(lái)表示“部分-整體”的關(guān)系,使用戶對(duì)單個(gè)對(duì)象和組合對(duì)象具有一致的訪問性。
實(shí)現(xiàn)
角色:
- 抽象構(gòu)件(Component)角色:它的主要作用是為樹葉構(gòu)件和樹枝構(gòu)件聲明公共接口,并實(shí)現(xiàn)它們的默認(rèn)行為。在透明式的組合模式中抽象構(gòu)件還聲明訪問和管理子類的接口;在安全式的組合模式中不聲明訪問和管理子類的接口,管理工作由樹枝構(gòu)件完成。
- 樹葉構(gòu)件(Leaf)角色:是組合中的葉節(jié)點(diǎn)對(duì)象,它沒有子節(jié)點(diǎn),用于實(shí)現(xiàn)抽象構(gòu)件角色中 聲明的公共接口。
- 樹枝構(gòu)件(Composite)角色:是組合中的分支節(jié)點(diǎn)對(duì)象,它有子節(jié)點(diǎn)。它實(shí)現(xiàn)了抽象構(gòu)件角色中聲明的接口,它的主要作用是存儲(chǔ)和管理子部件,通常包含 Add()、Remove()、GetChild() 等方法。
透明方式:在該方式中,由于抽象構(gòu)件聲明了所有子類中的全部方法,所以客戶端無(wú)須區(qū)別樹葉對(duì)象和樹枝對(duì)象,對(duì)客戶端來(lái)說(shuō)是透明的。但其缺點(diǎn)是:樹葉構(gòu)件本來(lái)沒有 Add()、Remove() 及 GetChild() 方法,卻要實(shí)現(xiàn)它們(空實(shí)現(xiàn)或拋異常),這樣會(huì)帶來(lái)一些安全性問題。

安全方式:在該方式中,將管理子構(gòu)件的方法移到樹枝構(gòu)件中,抽象構(gòu)件和樹葉構(gòu)件沒有對(duì)子對(duì)象的管理方法,這樣就避免了上一種方式的安全性問題,但由于葉子和分支有不同的接口,客戶端在調(diào)用時(shí)要知道樹葉對(duì)象和樹枝對(duì)象的存在,所以失去了透明性。
