結(jié)構(gòu)型設(shè)計(jì)概述和適配器模式.ppt_第1頁(yè)
結(jié)構(gòu)型設(shè)計(jì)概述和適配器模式.ppt_第2頁(yè)
結(jié)構(gòu)型設(shè)計(jì)概述和適配器模式.ppt_第3頁(yè)
結(jié)構(gòu)型設(shè)計(jì)概述和適配器模式.ppt_第4頁(yè)
結(jié)構(gòu)型設(shè)計(jì)概述和適配器模式.ppt_第5頁(yè)
已閱讀5頁(yè),還剩36頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、結(jié)構(gòu)型設(shè)計(jì)模式,桂勛 ,結(jié)構(gòu)型設(shè)計(jì)模式,結(jié)構(gòu)型設(shè)計(jì)模式概述,結(jié)構(gòu)型模式(Structural Pattern)描述如何將類或者對(duì)象結(jié)合在一起形成更大的結(jié)構(gòu),就像搭積木,可以通過(guò)簡(jiǎn)單積木的組合形成復(fù)雜的、功能更為強(qiáng)大的結(jié)構(gòu)。,結(jié)構(gòu)型設(shè)計(jì)模式的概述,結(jié)構(gòu)型模式可以分為類結(jié)構(gòu)型模式和對(duì)象結(jié)構(gòu)型模式: 類結(jié)構(gòu)型模式關(guān)心類的組合,由多個(gè)類可以組合成一個(gè)更大的系統(tǒng),在類結(jié)構(gòu)型模式中一般只存在繼承關(guān)系和實(shí)現(xiàn)關(guān)系。 對(duì)象結(jié)構(gòu)型模式關(guān)心類與對(duì)象的組合,通過(guò)關(guān)聯(lián)關(guān)系使得在一個(gè)類中定義另一個(gè)類的實(shí)例對(duì)象,然后通過(guò)該對(duì)象調(diào)用其方法。根據(jù)“合成復(fù)用原則”,在系統(tǒng)中盡量使用關(guān)聯(lián)關(guān)系來(lái)替代繼承關(guān)系,因此大部分結(jié)構(gòu)型模式都是

2、對(duì)象結(jié)構(gòu)型模式。,GOF95中的特化圖(1),1、類圖,2、對(duì)象圖,3、參與客戶和絕對(duì)客戶,GOF95中的特化圖(2),GOF95中的特化圖(3),第一個(gè)請(qǐng)求是aCreationTool發(fā)出的,請(qǐng)求創(chuàng)建aLineShape。接下來(lái),aLineShape被加入到aDrawing中,這導(dǎo)致aDrawing向它自身發(fā)出一個(gè)Refresh請(qǐng)求。而在Refresh操作過(guò)程中aDrawing又向aLineShape發(fā)出一個(gè)Draw請(qǐng)求。,Adapter-適配器 Bridge-橋接 Composite-組合 Decorator-裝飾 Facade-外觀 Flyweight-享元 Proxy-代理,結(jié)構(gòu)型設(shè)計(jì)

3、模式,Adapter-適配器,主要內(nèi)容,模式動(dòng)機(jī) 模式定義 模式結(jié)構(gòu) 模式的程序表示C+ 模式的程序表示Java 實(shí)例與解析 模式效果評(píng)價(jià) 模式的適用環(huán)境 模式擴(kuò)展 已知應(yīng)用 模式小結(jié),Adapter-適配器:動(dòng)機(jī),Adapter-適配器:動(dòng)機(jī),在軟件開(kāi)發(fā)中采用類似于電源適配器的設(shè)計(jì)和編碼技巧被稱為適配器模式。 通常情況下,客戶端可以通過(guò)目標(biāo)類的接口訪問(wèn)它所提供的服務(wù)。有時(shí),現(xiàn)有的類可以滿足客戶類的功能需要,但是它所提供的接口不一定是客戶類所期望的,這可能是因?yàn)楝F(xiàn)有類中方法名與目標(biāo)類中定義的方法名不一致等原因所導(dǎo)致的。 在這種情況下,現(xiàn)有的接口需要轉(zhuǎn)化為客戶類期望的接口,這樣保證了對(duì)現(xiàn)有類的重

4、用。如果不進(jìn)行這樣的轉(zhuǎn)化,客戶類就不能利用現(xiàn)有類所提供的功能,適配器模式可以完成這樣的轉(zhuǎn)化。,Adapter-適配器:動(dòng)機(jī),在適配器模式中可以定義一個(gè)包裝類,包裝不兼容接口的對(duì)象,這個(gè)包裝類指的就是適配器(Adapter),它所包裝的對(duì)象就是適配者(Adaptee),即被適配的類。 適配器提供客戶類需要的接口,適配器的實(shí)現(xiàn)就是把客戶類的請(qǐng)求轉(zhuǎn)化為對(duì)適配者的相應(yīng)接口的調(diào)用。也就是說(shuō):當(dāng)客戶類調(diào)用適配器的方法時(shí),在適配器類的內(nèi)部將調(diào)用適配者類的方法,而這個(gè)過(guò)程對(duì)客戶類是透明的,客戶類并不直接訪問(wèn)適配者類。因此,適配器可以使由于接口不兼容而不能交互的類可以一起工作。這就是適配器模式的模式動(dòng)機(jī)。,Ad

5、apter-適配器:動(dòng)機(jī),GOF95中的例子:,Adapter-適配器:定義,適配器模式(Adapter Pattern) :將一個(gè)接口轉(zhuǎn)換成客戶希望的另一個(gè)接口,適配器模式使接口不兼容的那些類可以一起工作,其別名為包裝器(Wrapper)。適配器模式既可以作為類結(jié)構(gòu)型模式,也可以作為對(duì)象結(jié)構(gòu)型模式。,Adapter-適配器:結(jié)構(gòu),(1)類適配器:類適配器使用多重繼承對(duì)一個(gè)接口與另一個(gè)接口進(jìn)行匹配,Adapter-適配器:結(jié)構(gòu),(2)對(duì)象適配器:對(duì)象適配器依賴于對(duì)象組合,Adapter-適配器:結(jié)構(gòu),Target(Shape) 定義Client使用的與特定領(lǐng)域相關(guān)的接口。 Client(Dra

6、wingEditor) 與符合Target接口的對(duì)象協(xié)同。 Adaptee(TextView) 定義一個(gè)已經(jīng)存在的接口,這個(gè)接口需要適配。 Adapter(TextShape) 對(duì)Adaptee的接口與Target接口進(jìn)行適配,Adapter-適配器:程序表示C+,class Shape public: Shape(); virtual void BoundingBox( Point,class TextView public: TextView(); void GetOrigin(Coord,class Manipulator ; class TextManipulator : public

7、 Manipulator public: TextManipulator(const TextShape*); ;,Adapter-適配器:程序表示C+,(1)類適配器,class TextShape : public Shape, private TextView public: TextShape(); virtual void BoundingBox( Point,void TextShape:BoundingBox ( Point ,Adapter-適配器:程序表示C+,(1)對(duì)象適配器,TextShape:TextShape (TextView* t) _text = t; void

8、 TextShape:BoundingBox ( Point ,class TextShape : public Shape public: TextShape(TextView*); virtual void BoundingBox( Point,Adapter-適配器:程序表示Java,Java中典型的類適配器代碼:,Adapter-適配器:程序表示Java,Java中典型的對(duì)象適配器代碼:,Adapter-適配器:實(shí)例與解析,實(shí)例一:仿生機(jī)器人 現(xiàn)需要設(shè)計(jì)一個(gè)可以模擬各種動(dòng)物行為的機(jī)器人,在機(jī)器人中定義了一系列方法,如機(jī)器人叫喊方法cry()、機(jī)器人移動(dòng)方法move()等。如果希望在不修

9、改已有代碼的基礎(chǔ)上使得機(jī)器人能夠像狗一樣叫,像狗一樣跑,使用適配器模式進(jìn)行系統(tǒng)設(shè)計(jì)。,Adapter-適配器:實(shí)例與解析,實(shí)例二:加密適配器 某系統(tǒng)需要提供一個(gè)加密模塊,將用戶信息(如密碼等機(jī)密信息)加密之后再存儲(chǔ)在數(shù)據(jù)庫(kù)中,系統(tǒng)已經(jīng)定義好了數(shù)據(jù)庫(kù)操作類。為了提高開(kāi)發(fā)效率,現(xiàn)需要重用已有的加密算法,這些算法封裝在一些由第三方提供的類中,有些甚至沒(méi)有源代碼。使用適配器模式設(shè)計(jì)該加密模塊,實(shí)現(xiàn)在不修改現(xiàn)有類的基礎(chǔ)上重用第三方加密方法。,Adapter-適配器:效果評(píng)價(jià),模式優(yōu)缺點(diǎn) 適配器模式的優(yōu)點(diǎn)如下: 將目標(biāo)類和適配者類解耦,通過(guò)引入一個(gè)適配器類來(lái)重用現(xiàn)有的適配者類,而無(wú)需修改原有代碼。 增加了

10、類的透明性和復(fù)用性,將具體的實(shí)現(xiàn)封裝在適配者類中,對(duì)于客戶端類來(lái)說(shuō)是透明的,而且提高了適配者的復(fù)用性。 靈活性和擴(kuò)展性都非常好,通過(guò)使用配置文件,可以很方便地更換適配器,也可以在不修改原有代碼的基礎(chǔ)上增加新的適配器類,完全符合“開(kāi)閉原則”。,Adapter-適配器:效果評(píng)價(jià),模式優(yōu)缺點(diǎn) 類適配器模式還具有如下優(yōu)點(diǎn): 由于適配器類是適配者類的子類,因此可以在適配器類中置換一些適配者的方法,使得適配器的靈活性更強(qiáng)。 類適配器模式的缺點(diǎn)如下: 對(duì)于Java、C#等不支持多重繼承的語(yǔ)言,一次最多只能適配一個(gè)適配者類,而且目標(biāo)抽象類只能為抽象類,不能為具體類,其使用有一定的局限性,不能將一個(gè)適配者類和它

11、的子類都適配到目標(biāo)接口。,Adapter-適配器:適用環(huán)境,系統(tǒng)需要使用現(xiàn)有的類,而這些類的接口不符合系統(tǒng)的需要。 想要建立一個(gè)可以重復(fù)使用的類,用于與一些彼此之間沒(méi)有太大關(guān)聯(lián)的一些類,包括一些可能在將來(lái)引進(jìn)的類一起工作。,Adapter-適配器:模式擴(kuò)展,缺省適配器模式(Default Adapter Pattern) 當(dāng)不需要全部實(shí)現(xiàn)接口提供的方法時(shí),可先設(shè)計(jì)一個(gè)抽象類實(shí)現(xiàn)接口,并為該接口中每個(gè)方法提供一個(gè)默認(rèn)實(shí)現(xiàn)(空方法),那么該抽象類的子類可有選擇地覆蓋父類的某些方法來(lái)實(shí)現(xiàn)需求,它適用于一個(gè)接口不想使用其所有的方法的情況。因此也稱為單接口適配器模式。,Adapter-適配器:模式擴(kuò)展,

12、缺省適配器模式 適配者接口 缺省適配器類 具體業(yè)務(wù)類,Adapter-適配器:模式擴(kuò)展,缺省適配器模式舉例(1) 寬接口:,Adapter-適配器:模式擴(kuò)展,缺省適配器模式舉例(2)【GOF95】【P95】從已有接口中尋找最小適配接口(窄接口)。,Adapter-適配器:模式擴(kuò)展,缺省適配器模式舉例(2)【GOF95】【P96】從已有接口中尋找最小適配接口,采用獨(dú)立抽象并結(jié)合Proxy代理模式。,Adapter-適配器:模式擴(kuò)展,雙向適配器 在對(duì)象適配器的使用過(guò)程中,如果在適配器中同時(shí)包含對(duì)目標(biāo)類和適配者類的引用,適配者可以通過(guò)它調(diào)用目標(biāo)類中的方法,目標(biāo)類也可以通過(guò)它調(diào)用適配者類中的方法,那么

13、該適配器就是一個(gè)雙向適配器。,Adapter-適配器:模式擴(kuò)展,雙向適配器結(jié)構(gòu):,Adapter-適配器:模式擴(kuò)展,雙向適配器模式舉例【GOF95】【P95】:考慮一個(gè)雙向適配器,它將圖形編輯框架Unidraw與約束求解工具箱QOCA集成起來(lái)。這兩個(gè)系統(tǒng)都有一些類,這些類顯式地表示變量:Unidraw含有類StateVariable,QOCA中含有類ConstraintVariable,如下圖所示。為了使Unidraw與QOCA協(xié)同工作,必須首先使類ConstraintVariable與類StateVariable相匹配;而為了將QOCA的求解結(jié)果傳遞給Unidraw,必須使StateVari

14、able與ConstraintVariable相匹配,Adapter-適配器:已知應(yīng)用,(1) Sun公司在1996年公開(kāi)了Java語(yǔ)言的數(shù)據(jù)庫(kù)連接工具JDBC,JDBC使得Java語(yǔ)言程序能夠與數(shù)據(jù)庫(kù)連接,并使用SQL語(yǔ)言來(lái)查詢和操作數(shù)據(jù)。JDBC給出一個(gè)客戶端通用的抽象接口,每一個(gè)具體數(shù)據(jù)庫(kù)引擎(如SQL Server、Oracle、MySQL等)的JDBC驅(qū)動(dòng)軟件都是一個(gè)介于JDBC接口和數(shù)據(jù)庫(kù)引擎接口之間的適配器軟件。抽象的JDBC接口和各個(gè)數(shù)據(jù)庫(kù)引擎API之間都需要相應(yīng)的適配器軟件,這就是為各個(gè)不同數(shù)據(jù)庫(kù)引擎準(zhǔn)備的驅(qū)動(dòng)程序。 (2) 在組件對(duì)象模型COM中,通過(guò)聚合使新開(kāi)發(fā)的組件能集

15、成已有的組件,新組件就變成了一個(gè)用戶適配器(二進(jìn)制適配器)。,Adapter-適配器:已知應(yīng)用,(3)在Spring AOP框架中,對(duì)BeforeAdvice、AfterAdvice、ThrowsAdvice三種通知類型借助適配器模式來(lái)實(shí)現(xiàn)。,Adapter-適配器:已知應(yīng)用,(4)在JDK類庫(kù)中也定義了一系列適配器類,如在mon包中定義的InputStreamAdapter類,用于包裝ImageInputStream接口及其子類對(duì)象。,Adapter-適配器:模式小結(jié),結(jié)構(gòu)型模式描述如何將類或者對(duì)象結(jié)合在一起形成更大的結(jié)構(gòu)。 適配器模式用于將一個(gè)接口轉(zhuǎn)換成客戶希望的另一個(gè)接口,適配器模式使接

16、口不兼容的那些類可以一起工作,其別名為包裝器。適配器模式既可以作為類結(jié)構(gòu)型模式,也可以作為對(duì)象結(jié)構(gòu)型模式。 適配器模式包含四個(gè)角色:目標(biāo)抽象類定義客戶要用的特定領(lǐng)域的接口;適配器類可以調(diào)用另一個(gè)接口,作為一個(gè)轉(zhuǎn)換器,對(duì)適配者和抽象目標(biāo)類進(jìn)行適配,它是適配器模式的核心;適配者類是被適配的角色,它定義了一個(gè)已經(jīng)存在的接口,這個(gè)接口需要適配;在客戶類中針對(duì)目標(biāo)抽象類進(jìn)行編程,調(diào)用在目標(biāo)抽象類中定義的業(yè)務(wù)方法。 在類適配器模式中,適配器類實(shí)現(xiàn)了目標(biāo)抽象類接口并繼承了適配者類,并在目標(biāo)抽象類的實(shí)現(xiàn)方法中調(diào)用所繼承的適配者類的方法;在對(duì)象適配器模式中,適配器類繼承了目標(biāo)抽象類并定義了一個(gè)適配者類的對(duì)象實(shí)例,在所繼承的目標(biāo)抽象類方法

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論