設(shè)計模式——結(jié)構(gòu)型模式

一.適配器模式

(1)模式動機(jī):采用類似電源適配器的設(shè)計和編碼技巧被稱為適配器模式念颈,客戶可以通過目標(biāo)類的接口訪問它所提供的服務(wù)

在適配器模式中可以定義一個包裝類椿每,包裝不兼容接口的對象,這個包裝類指的就是適配器(Adapter),它所包裝的對象就是適配者(Adaptee)察皇,即被適配的類。適配器的實現(xiàn)就是把客戶類的請求轉(zhuǎn)化為對適配者的相應(yīng)接口的調(diào)用凌净。也就是說:當(dāng)客戶類調(diào)用適配器的方法時,在適配器類的內(nèi)部將調(diào)用適配者類的方法屋讶,而這個過程對客戶類是透明的冰寻,客戶類并不直接訪問適配者類。因此皿渗,適配器可以使由于接口不兼容而不能交互的類可以一起工作

(2)模式定義:適配器模式(Adapter Pattern):將一個接口轉(zhuǎn)換成客戶希望的另一個接口斩芭,適配器模式使接口不兼容的那些類可以一起工作,其別名為包裝器(Wrapper)羹奉。適配器模式既可以作為類結(jié)構(gòu)型模式秒旋,也可以作為對象結(jié)構(gòu)型模式

(3)模式結(jié)構(gòu)

Target:目標(biāo)抽象類

Adapter:適配器類

Adaptee:適配者類

Client:客戶類

(4)優(yōu)缺點:

優(yōu)點:

將目標(biāo)類和適配者類解耦,通過引入一個適配器類來重用現(xiàn)有的適配者類诀拭,而無須修改原有代碼迁筛。

增加了類的透明性和復(fù)用性,將具體的實現(xiàn)封裝在適配者類中耕挨,對于客戶端類來說是透明的细卧,而且提高了適配者的復(fù)用性。

靈活性和擴(kuò)展性都非常好筒占,通過使用配置文件贪庙,可以很方便地更換適配器,也可以在不修改原有代碼的基礎(chǔ)上增加新的適配器類翰苫,完全符合“開閉原則”

類適配器優(yōu)缺點:類適配器模式還具有如下優(yōu)點:由于適配器類是適配者類的子類止邮,因此可以在適配器類中置換一些適配者的方法,使得適配器的靈活性更強(qiáng)奏窑。

類適配器模式的缺點如下:對于Java导披、C#等不支持多重繼承的語言,一次最多只能適配一個適配者類埃唯,而且目標(biāo)抽象類只能為抽象類撩匕,不能為具體類,其使用有一定的局限性墨叛,不能將一個適配者類和它的子類都適配到目標(biāo)接口止毕。

對象適配器模式還具有如下優(yōu)點:一個對象適配器可以把多個不同的適配者適配到同一個目標(biāo),也就是說漠趁,同一個適配器可以把適配者類和它的子類都適配到目標(biāo)接口扁凛。

對象適配器模式的缺點如下:與類適配器模式相比,要想置換適配者類的方法就不容易棚潦。如果一定要置換掉適配者類的一個或多個方法令漂,就只好先做一個適配者類的子類,將適配者類的方法置換掉,然后再把適配者類的子類當(dāng)做真正的適配者進(jìn)行適配叠必,實現(xiàn)過程較為復(fù)雜荚孵。

(5)適用環(huán)境:系統(tǒng)使用現(xiàn)有的類,而這些類的接口不符合系統(tǒng)的需要纬朝。想要建立一個可以重復(fù)使用的類收叶,用于與一些彼此之間沒有太大關(guān)聯(lián)的一些類

(6)雙向適配器

在對象適配器的使用過程中,如果在適配器中同時包含對目標(biāo)類和適配者類的引用共苛,適配者可以通過它調(diào)用目標(biāo)類中的方法判没,目標(biāo)類也可以通過它調(diào)用適配者類中的方法,那么該適配器就是一個雙向適配器

二.橋接模式

(1)模式動機(jī):對于有兩個變化維度(即兩個變化的原因)的系統(tǒng)隅茎,采用方案二來進(jìn)行設(shè)計系統(tǒng)中類的個數(shù)更少澄峰,且系統(tǒng)擴(kuò)展更為方便。設(shè)計方案二即是橋接模式的應(yīng)用辟犀。橋接模式將繼承關(guān)系轉(zhuǎn)換為關(guān)聯(lián)關(guān)系俏竞,從而降低了類與類之間的耦合,減少了代碼編寫量

(2)橋接模式(Bridge Pattern):將抽象部分與它的實現(xiàn)部分分離堂竟,使它們都可以獨立地變化魂毁。它是一種對象結(jié)構(gòu)型模式,又稱為柄體(Handle and Body)模式或接口(Interface)模式

(3)模式結(jié)構(gòu)

Abstraction:抽象類

RefinedAbstraction:擴(kuò)充抽象類

Implementor:實現(xiàn)類接口

ConcreteImplementor:具體實現(xiàn)類

(4)優(yōu)缺點:

橋接模式的優(yōu)點

分離抽象接口及其實現(xiàn)部分出嘹。

橋接模式有時類似于多繼承方案席楚,但是多繼承方案違背了類的單一職責(zé)原則(即一個類只有一個變化的原因),復(fù)用性比較差税稼,而且多繼承結(jié)構(gòu)中類的個數(shù)非常龐大烦秩,橋接模式是比多繼承方案更好的解決方法。

橋接模式提高了系統(tǒng)的可擴(kuò)充性郎仆,在兩個變化維度中任意擴(kuò)展一個維度闻镶,都不需要修改原有系統(tǒng)。

實現(xiàn)細(xì)節(jié)對客戶透明丸升,可以對用戶隱藏實現(xiàn)細(xì)節(jié)

橋接模式的缺點

橋接模式的引入會增加系統(tǒng)的理解與設(shè)計難度,由于聚合關(guān)聯(lián)關(guān)系建立在抽象層牺氨,要求開發(fā)者針對抽象進(jìn)行設(shè)計與編程狡耻。

橋接模式要求正確識別出系統(tǒng)中兩個獨立變化的維度,因此其使用范圍具有一定的局限性猴凹。

三.組合模式

(1)模式動機(jī):組合模式描述了如何將容器對象和葉子對象進(jìn)行遞歸組合夷狰,使得用戶在使用時無須對它們進(jìn)行區(qū)分,可以一致地對待容器對象和葉子對象

(2)模式定義:組合多個對象形成樹形結(jié)構(gòu)以表示“整體-部分”的結(jié)構(gòu)層次郊霎,組合模式對單個對象(即葉子對象)組合對象(即容器對象)的使用過具有一致性

(3)模式結(jié)構(gòu)

Component:抽象構(gòu)件

Leaf:葉子構(gòu)件

Composite:容器構(gòu)件

Client:客戶類

(4)

(5)優(yōu)缺點:

優(yōu)點:

可以清楚地定義分層次的復(fù)雜對象沼头,表示對象的全部或部分層次,使得增加新構(gòu)件也更容易。

客戶端調(diào)用簡單进倍,客戶端可以一致的使用組合結(jié)構(gòu)或其中單個對象土至。

定義了包含葉子對象和容器對象的類層次結(jié)構(gòu),葉子對象可以被組合成更復(fù)雜的容器對象猾昆,而這個容器對象又可以被組合陶因,這樣不斷遞歸下去,可以形成復(fù)雜的樹形結(jié)構(gòu)垂蜗。

更容易在組合體內(nèi)加入對象構(gòu)件楷扬,客戶端不必因為加入了新的對象構(gòu)件而更改原有代碼。

缺點:

使設(shè)計變得更加抽象贴见,對象的業(yè)務(wù)規(guī)則如果很復(fù)雜烘苹,則實現(xiàn)組合模式具有很大挑戰(zhàn)性,而且不是所有的方法都與葉子對象子類都有關(guān)聯(lián)片部。

增加新構(gòu)件時可能會產(chǎn)生一些問題镣衡,很難對容器中的構(gòu)件類型進(jìn)行限制。

(6)拓展:

安全/透明組合模式

四.裝飾模式

1.模式動機(jī):在不需要創(chuàng)造子類的情況下吞琐,將對象的功能加以擴(kuò)展

一般有兩種方式可以實現(xiàn)給一個類或?qū)ο笤黾有袨椋?/p>

繼承機(jī)制捆探,使用繼承機(jī)制是給現(xiàn)有類添加功能的一種有效途徑,通過繼承一個現(xiàn)有類可以使得子類在擁有自身方法的同時還擁有父類的方法站粟。但是這種方法是靜態(tài)的黍图,用戶不能控制增加行為的方式和時機(jī)。

關(guān)聯(lián)機(jī)制奴烙,即將一個類的對象嵌入另一個對象中助被,由另一個對象來決定是否調(diào)用嵌入對象的行為以便擴(kuò)展自己的行為,我們稱這個嵌入的對象為裝飾器(Decorator)切诀。

2.模式定義:動態(tài)地給一個對象增加一些額外的職責(zé)(Responsibility)揩环,就增加對象功能來說,裝飾模式比生成子類實現(xiàn)更為靈活幅虑。其別名也可以稱為包裝器(Wrapper)

3.

4.應(yīng)用:java的swing中 jdk

5.

裝飾模式的簡化-需要注意的問題

一個裝飾類的接口必須與被裝飾類的接口保持相同丰滑,對于客戶端來說無論是裝飾之前的對象還是裝飾之后的對象都可以一致對待。

盡量保持具體構(gòu)件類Component作為一個“輕”類倒庵,也就是說不要把太多的邏輯和狀態(tài)放在具體構(gòu)件類中褒墨,可以通過裝飾類對其進(jìn)行擴(kuò)展。

如果只有一個具體構(gòu)件類而沒有抽象構(gòu)件類擎宝,那么抽象裝飾類可以作為具體構(gòu)件類的直接子類郁妈。

模式擴(kuò)展

透明裝飾模式(多重加密系統(tǒng))

在透明裝飾模式中,要求客戶端完全針對抽象編程绍申,裝飾模式的透明性要求客戶端程序不應(yīng)該聲明具體構(gòu)件類型和具體裝飾類型噩咪,而應(yīng)該全部聲明為抽象構(gòu)件類型顾彰。

半透明裝飾模式(變形金剛)

大多數(shù)裝飾模式都是半透明(semi-transparent)的裝飾模式,而不是完全透明(transparent)的胃碾。即允許用戶在客戶端聲明具體裝飾者類型的對象涨享,調(diào)用在具體裝飾者中新增的方法。

6.

裝飾模式的主要優(yōu)點在于可以提供比繼承更多的靈活性书在,可以通過一種動態(tài)的方式來擴(kuò)展一個對象的功能灰伟,并通過使用不同的具體裝飾類以及這些裝飾類的排列組合,可以創(chuàng)造出很多不同行為的組合儒旬,而且具體構(gòu)件類與具體裝飾類可以獨立變化栏账,用戶可以根據(jù)需要增加新的具體構(gòu)件類和具體裝飾類;其主要缺點在于使用裝飾模式進(jìn)行系統(tǒng)設(shè)計時將產(chǎn)生很多小對象栈源,而且裝飾模式比繼承更加易于出錯挡爵,排錯也很困難,對于多次裝飾的對象甚垦,調(diào)試時尋找錯誤可能需要逐級排查茶鹃,較為煩瑣。

五.外觀模式(門面模式)

1.模式動機(jī):

引入外觀角色之后艰亮,用戶只需要直接與外觀角色交互闭翩,用戶與子系統(tǒng)之間的復(fù)雜關(guān)系由外觀角色來實現(xiàn),從而降低了系統(tǒng)的耦合度迄埃。

2.模式定義:

外觀模式(Facade Pattern):外部與一個子系統(tǒng)的通信必須通過一個統(tǒng)一的外觀對象進(jìn)行疗韵,為子系統(tǒng)中的一組接口提供一個一致的界面,外觀模式定義了一個高層接口侄非,這個接口使得這一子系統(tǒng)更加容易使用蕉汪。外觀模式又稱為門面模式,它是一種對象結(jié)構(gòu)型模式逞怨。

3.

4.應(yīng)用:jdbc

session

5.

抽象外觀類的引入

外觀模式最大的缺點在于違背了“開閉原則”者疤,當(dāng)增加新的子系統(tǒng)或者移除子系統(tǒng)時需要修改外觀類,可以通過引入抽象外觀類在一定程度上解決該問題叠赦,客戶端針對抽象外觀類進(jìn)行編程驹马。對于新的業(yè)務(wù)需求,不修改原有外觀類除秀,而對應(yīng)增加一個新的具體外觀類窥翩,由新的具體外觀類來關(guān)聯(lián)新的子系統(tǒng)對象,同時通過修改配置文件來達(dá)到不修改源代碼并更換外觀類的目的鳞仙。

6.

外觀模式主要優(yōu)點在于對客戶屏蔽子系統(tǒng)組件,減少了客戶處理的對象數(shù)目并使得子系統(tǒng)使用起來更加容易笔时,它實現(xiàn)了子系統(tǒng)與客戶之間的松耦合關(guān)系棍好,并降低了大型軟件系統(tǒng)中的編譯依賴性,簡化了系統(tǒng)在不同平臺之間的移植過程;其缺點在于不能很好地限制客戶使用子系統(tǒng)類借笙,而且在不引入抽象外觀類的情況下扒怖,增加新的子系統(tǒng)可能需要修改外觀類或客戶端的源代碼,違背了“開閉原則”业稼。

六.享遠(yuǎn)模式

1.模式動機(jī):享元對象一般都設(shè)計為較小的對象盗痒,它所包含的內(nèi)部狀態(tài)較少,這種對象也稱為細(xì)粒度對象低散。享元模式的目的就是使用共享技術(shù)來實現(xiàn)大量細(xì)粒度對象的復(fù)用

在享元模式中通常會出現(xiàn)工廠模式俯邓,需要創(chuàng)建一個享元工廠來負(fù)責(zé)維護(hù)一個享元池(Flyweight Pool)用于存儲具有相同內(nèi)部狀態(tài)的享元對象。

2.模式定義:運用共享技術(shù)有效地支持大量細(xì)粒度對象的復(fù)用熔号。系統(tǒng)只使用少量的對象稽鞭,而這些對象都很相似,狀態(tài)變化很小引镊,可以實現(xiàn)對象的多次復(fù)用朦蕴。

3.

4.享元模式的核心在于享元工廠類,享元工廠類的作用在于提供一個用于存儲享元對象的享元池弟头,用戶需要對象時吩抓,首先從享元池中獲取,如果享元池中不存在赴恨,則創(chuàng)建一個新的享元對象返回給用戶疹娶,并在享元池中保存該新增對象。

5.應(yīng)用:string

6.模式擴(kuò)展

享元模式與其他模式的聯(lián)用

在享元模式的享元工廠類中通常提供一個靜態(tài)的工廠方法用于返回享元對象嘱支,使用簡單工廠模式來生成享元對象蚓胸。

在一個系統(tǒng)中,通常只有唯一一個享元工廠除师,因此享元工廠類可以使用單例模式進(jìn)行設(shè)計沛膳。

享元模式可以結(jié)合組合模式形成復(fù)合享元模式,統(tǒng)一對享元對象設(shè)置外部狀態(tài)汛聚。

7.享元模式主要優(yōu)點在于它可以極大減少內(nèi)存中對象的數(shù)量锹安,使得相同對象或相似對象在內(nèi)存中只保存一份;其缺點是使得系統(tǒng)更加復(fù)雜倚舀,并且需要將享元對象的狀態(tài)外部化叹哭,而讀取外部狀態(tài)使得運行時間變長。

七.代理模式

1.模式動機(jī):通過引入一個新的對象(如小圖片和遠(yuǎn)程代理對象)來實現(xiàn)對真實對象的操作或者將新的對象作為真實對象的一個替身痕貌,這種實現(xiàn)機(jī)制即為代理模式风罩,通過引入代理對象來間接訪問一個對象,這就是代理模式的模式動機(jī)舵稠。

2.模式定義:給某一個對象提供一個代理超升,并由代理對象控制對原對象的引用入宦。代理模式的英文叫做Proxy或Surrogate,它是一種對象結(jié)構(gòu)型模式

3.

4.類別:

遠(yuǎn)程(Remote)代理:為一個位于不同的地址空間的對象提供一個本地的代理對象室琢,這個不同的地址空間可以是在同一臺主機(jī)中乾闰,也可是在另一臺主機(jī)中,遠(yuǎn)程代理又叫做大使(Ambassador)盈滴。

虛擬(Virtual)代理:如果需要創(chuàng)建一個資源消耗較大的對象涯肩,先創(chuàng)建一個消耗相對較小的對象來表示,真實對象只在需要時才會被真正創(chuàng)建巢钓。

Copy-on-Write代理:它是虛擬代理的一種病苗,把復(fù)制(克隆)操作延遲到只有在客戶端真正需要時才執(zhí)行竿报。一般來說铅乡,對象的深克隆是一個開銷較大的操作,Copy-on-Write代理可以讓這個操作延遲烈菌,只有對象被用到的時候才被克隆

保護(hù)(Protect or Access)代理:控制對一個對象的訪問阵幸,可以給不同的用戶提供不同級別的使用權(quán)限。

緩沖(Cache)代理:為某一個目標(biāo)操作的結(jié)果提供臨時的存儲空間芽世,以便多個客戶端可以共享這些結(jié)果挚赊。

防火墻(Firewall)代理:保護(hù)目標(biāo)不讓惡意用戶接近。

同步化(Synchronization)代理:使幾個用戶能夠同時使用一個對象而沒有沖突济瓢。

智能引用(Smart Reference)代理:當(dāng)一個對象被引用時荠割,提供一些額外的操作,如將此對象被調(diào)用的次數(shù)記錄下來等旺矾。

5.java RMI遠(yuǎn)程調(diào)用方法?分布式技術(shù) AOP技術(shù)

6.代理模式的優(yōu)點在于能夠協(xié)調(diào)調(diào)用者和被調(diào)用者蔑鹦,在一定程度上降低了系統(tǒng)的耦合度;其缺點在于由于在客戶端和真實主題之間增加了代理對象箕宙,因此有些類型的代理模式可能會造成請求的處理速度變慢嚎朽,并且實現(xiàn)代理模式需要額外的工作,有些代理模式的實現(xiàn)非常復(fù)雜柬帕。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末哟忍,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子陷寝,更是在濱河造成了極大的恐慌锅很,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凤跑,死亡現(xiàn)場離奇詭異爆安,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)仔引,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門扔仓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來致扯,“玉大人,你說我怎么就攤上這事当辐。” “怎么了鲤看?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵缘揪,是天一觀的道長。 經(jīng)常有香客問我义桂,道長找筝,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任慷吊,我火速辦了婚禮袖裕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘溉瓶。我一直安慰自己急鳄,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布堰酿。 她就那樣靜靜地躺著疾宏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪触创。 梳的紋絲不亂的頭發(fā)上坎藐,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天,我揣著相機(jī)與錄音哼绑,去河邊找鬼岩馍。 笑死,一個胖子當(dāng)著我的面吹牛抖韩,可吹牛的內(nèi)容都是我干的蛀恩。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼帽蝶,長吁一口氣:“原來是場噩夢啊……” “哼赦肋!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起励稳,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤佃乘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后驹尼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體趣避,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年新翎,在試婚紗的時候發(fā)現(xiàn)自己被綠了程帕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片住练。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖愁拭,靈堂內(nèi)的尸體忽然破棺而出讲逛,到底是詐尸還是另有隱情,我是刑警寧澤岭埠,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布盏混,位于F島的核電站,受9級特大地震影響惜论,放射性物質(zhì)發(fā)生泄漏许赃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一馆类、第九天 我趴在偏房一處隱蔽的房頂上張望混聊。 院中可真熱鬧,春花似錦乾巧、人聲如沸句喜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽藤滥。三九已至,卻和暖如春社裆,著一層夾襖步出監(jiān)牢的瞬間拙绊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工泳秀, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留标沪,地道東北人。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓嗜傅,卻偏偏與公主長得像金句,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子吕嘀,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容