




已閱讀5頁(yè),還剩46頁(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)介
適配器模式 /橋接模式,結(jié)構(gòu)型模式 結(jié)構(gòu)型模式概述 結(jié)構(gòu)型模式簡(jiǎn)介 適配器模式 模式動(dòng)機(jī)與定義 模式結(jié)構(gòu)與分析 模式實(shí)例與解析 模式效果與應(yīng)用 模式擴(kuò)展,橋接模式 模式動(dòng)機(jī)與定義 模式結(jié)構(gòu)與分析 模式實(shí)例與解析 模式效果與應(yīng)用,結(jié)構(gòu)型模式,結(jié)構(gòu)型模式概述 結(jié)構(gòu)型模式(Structural Pattern)描述如何將類或者對(duì)象結(jié)合在一起形成更大的結(jié)構(gòu),就像搭積木,可以通過(guò)簡(jiǎn)單積木的組合形成復(fù)雜的、功能更為強(qiáng)大的結(jié)構(gòu)。,結(jié)構(gòu)型模式,結(jié)構(gòu)型模式概述 根據(jù)這一點(diǎn),結(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)型模式都是對(duì)象結(jié)構(gòu)型模式。,結(jié)構(gòu)型模式,結(jié)構(gòu)型模式簡(jiǎn)介 適配器模式(Adapter) 橋接模式(Bridge) 組合模式(Composite) 裝飾模式(Decorator) 外觀模式(Facade) 享元模式(Flyweight) 代理模式(Proxy),適配器模式,模式動(dòng)機(jī),適配器模式,模式動(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)有類的重用。如果不進(jìn)行這樣的轉(zhuǎn)化,客戶類就不能利用現(xiàn)有類所提供的功能,適配器模式可以完成這樣的轉(zhuǎn)化。,適配器模式,模式動(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ī)。,適配器模式,模式定義 適配器模式(Adapter Pattern) :將一個(gè)接口轉(zhuǎn)換成客戶希望的另一個(gè)接口,適配器模式使接口不兼容的那些類可以一起工作,其別名為包裝器(Wrapper)。適配器模式既可以作為類結(jié)構(gòu)型模式,也可以作為對(duì)象結(jié)構(gòu)型模式。,適配器模式,模式結(jié)構(gòu) 類適配器,適配器模式,模式結(jié)構(gòu) 對(duì)象適配器,適配器模式,模式結(jié)構(gòu) 適配器模式包含如下角色: Target:目標(biāo)抽象類 Adapter:適配器類 Adaptee:適配者類 Client:客戶類,適配器模式,模式分析 典型的類適配器代碼:,適配器模式,模式分析 典型的對(duì)象適配器代碼:,適配器模式,適配器模式實(shí)例與解析 實(shí)例一:仿生機(jī)器人 現(xiàn)需要設(shè)計(jì)一個(gè)可以模擬各種動(dòng)物行為的機(jī)器人,在機(jī)器人中定義了一系列方法,如機(jī)器人叫喊方法cry()、機(jī)器人移動(dòng)方法move()等。如果希望在不修改已有代碼的基礎(chǔ)上使得機(jī)器人能夠像狗一樣叫,像狗一樣跑,使用適配器模式進(jìn)行系統(tǒng)設(shè)計(jì)。,適配器模式,適配器模式實(shí)例與解析 實(shí)例一:仿生機(jī)器人,適配器模式,模式優(yōu)缺點(diǎn) 適配器模式的優(yōu)點(diǎn)如下: 將目標(biāo)類和適配者類解耦,通過(guò)引入一個(gè)適配器類來(lái)重用現(xiàn)有的適配者類,而無(wú)需修改原有代碼。 增加了類的透明性和復(fù)用性,將具體的實(shí)現(xiàn)封裝在適配者類中,對(duì)于客戶端類來(lái)說(shuō)是透明的,而且提高了適配者的復(fù)用性。 靈活性和擴(kuò)展性都非常好,通過(guò)使用配置文件,可以很方便地更換適配器,也可以在不修改原有代碼的基礎(chǔ)上增加新的適配器類,完全符合“開(kāi)閉原則”。,適配器模式,模式優(yōu)缺點(diǎn) 類適配器模式還具有如下優(yōu)點(diǎn): 由于適配器類是適配者類的子類,因此可以在適配器類中置換一些適配者的方法,使得適配器的靈活性更強(qiáng)。 類適配器模式的缺點(diǎn)如下: 對(duì)于Java、C#等不支持多重繼承的語(yǔ)言,一次最多只能適配一個(gè)適配者類,而且目標(biāo)抽象類只能為抽象類,不能為具體類,其使用有一定的局限性,不能將一個(gè)適配者類和它的子類都適配到目標(biāo)接口。,適配器模式,模式優(yōu)缺點(diǎn) 對(duì)象適配器模式還具有如下優(yōu)點(diǎn): 一個(gè)對(duì)象適配器可以把多個(gè)不同的適配者適配到同一個(gè)目標(biāo),也就是說(shuō),同一個(gè)適配器可以把適配者類和它的子類都適配到目標(biāo)接口。 對(duì)象適配器模式的缺點(diǎn)如下: 與類適配器模式相比,要想置換適配者類的方法就不容易。如果一定要置換掉適配者類的一個(gè)或多個(gè)方法,就只好先做一個(gè)適配者類的子類,將適配者類的方法置換掉,然后再把適配者類的子類當(dāng)做真正的適配者進(jìn)行適配,實(shí)現(xiàn)過(guò)程較為復(fù)雜。,適配器模式,模式使用 在以下情況下可以使用適配器模式: 系統(tǒng)需要使用現(xiàn)有的類,而這些類的接口不符合系統(tǒng)的需要。 想要建立一個(gè)可以重復(fù)使用的類,用于與一些彼此之間沒(méi)有太大關(guān)聯(lián)的一些類,包括一些可能在將來(lái)引進(jìn)的類一起工作。,適配器模式,模式應(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)程序。,適配器模式,模式應(yīng)用 (2)在Spring AOP框架中,對(duì)BeforeAdvice、AfterAdvice、ThrowsAdvice三種通知類型借助適配器模式來(lái)實(shí)現(xiàn)。,適配器模式,模式擴(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è)接口不想使用其所有的方法的情況。因此也稱為單接口適配器模式。,適配器模式,模式擴(kuò)展 雙向適配器 在對(duì)象適配器的使用過(guò)程中,如果在適配器中同時(shí)包含對(duì)目標(biāo)類和適配者類的引用,適配者可以通過(guò)它調(diào)用目標(biāo)類中的方法,目標(biāo)類也可以通過(guò)它調(diào)用適配者類中的方法,那么該適配器就是一個(gè)雙向適配器。,適配器模式,模式擴(kuò)展 雙向適配器,適配器模式總結(jié),適配器模式用于將一個(gè)接口轉(zhuǎn)換成客戶希望的另一個(gè)接口,適配器模式使接口不兼容的那些類可以一起工作,其別名為包裝器。適配器模式既可以作為類結(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)抽象類方法中調(diào)用適配者類的相應(yīng)業(yè)務(wù)方法。,適配器模式的主要優(yōu)點(diǎn)是將目標(biāo)類和適配者類解耦,增加了類的透明性和復(fù)用性,同時(shí)系統(tǒng)的靈活性和擴(kuò)展性都非常好,更換適配器或者增加新的適配器都非常方便,符合“開(kāi)閉原則”;類適配器模式的缺點(diǎn)是適配器類在很多編程語(yǔ)言中不能同時(shí)適配多個(gè)適配者類,對(duì)象適配器模式的缺點(diǎn)是很難置換適配者類的方法。 適配器模式適用情況包括:系統(tǒng)需要使用現(xiàn)有的類,而這些類的接口不符合系統(tǒng)的需要;想要建立一個(gè)可以重復(fù)使用的類,用于與一些彼此之間沒(méi)有太大關(guān)聯(lián)的一些類一起工作。,橋接模式,模式動(dòng)機(jī) 將實(shí)現(xiàn)抽象部分與實(shí)現(xiàn)部分分離,使它們各自可以獨(dú)立地變化。,橋接模式,模式動(dòng)機(jī) 設(shè)想要繪制一幅圖畫(huà),藍(lán)天、白云、綠樹(shù)、小鳥(niǎo),如果畫(huà)面尺寸很大,那么用蠟筆繪制就會(huì)遇到點(diǎn)麻煩。畢竟細(xì)細(xì)的蠟筆要涂出一片藍(lán)天,是有些麻煩。如果有可能,最好有套大號(hào)蠟筆,粗粗的蠟筆很快能涂抹完成。至于色彩嗎,最好每種顏色來(lái)支粗的,除了藍(lán)天還有綠地呢。這樣,如果一套12種顏色的蠟筆,我們需要兩套24支,同種顏色的一粗一細(xì)。這樣你就會(huì)想要是再有一套中號(hào)蠟筆就更好了,這樣,不多不少總共36支蠟筆。,橋接模式,橋接模式,橋接模式,模式結(jié)構(gòu),橋接模式,Abstraction:定義抽象類的接口,維護(hù)一個(gè)指向Implementor類型的指針。 Refined Abstraction:擴(kuò)充Abstraction定義的接口,改變和修正父類對(duì)抽象化的定義。 Implementor:這個(gè)角色給出實(shí)現(xiàn)化角色的接口,但不給出具體的實(shí)現(xiàn)。必須指出的是,這個(gè)接口不一定和抽象化角色的接口定義相同,實(shí)際上,這兩個(gè)接口可以非常不一樣。實(shí)現(xiàn)化角色應(yīng)當(dāng)只給出底層操作,而抽象化角色應(yīng)當(dāng)只給出基于底層操作的更高一層的操作。 Concrete Implementor:這個(gè)角色給出實(shí)現(xiàn)化角色接口的具體實(shí)現(xiàn)。,橋接模式,模式分析 abstract class Abstraction private Implementor imp; /抽象部分包含的實(shí)現(xiàn)者 public Implementor Imp set imp = value; get return imp; public abstract void Operation(); ,橋接模式,模式分析 派生抽象化角色 class RefinedAbstraction : Abstraction public override void Operation() Imp.OperationImp(); /調(diào)用實(shí)現(xiàn)者的方法實(shí)現(xiàn)操作 ,橋接模式,模式分析 實(shí)現(xiàn)者角色 abstract class Implementor public abstract void OperationImp(); ,橋接模式,模式分析 具體實(shí)現(xiàn)者角色A class ConcreteImplementorA : Implementor public override void OperationImp() Console.WriteLine(“ConcreteImplementAs Operator !“); ,橋接模式,模式分析 具體實(shí)現(xiàn)者角色B class ConcreteImplementorB : Implementor public override void OperationImp() Console.WriteLine(“ConcreteImplementBs Operator !“); ,橋接模式,模式實(shí)用性 如果一個(gè)系統(tǒng)需要在構(gòu)件的抽象化角色和具體化角色之間增加更多的靈活性,避免在兩個(gè)層次之間建立靜態(tài)的聯(lián)系。 設(shè)計(jì)要求實(shí)現(xiàn)化角色的任何改變不應(yīng)當(dāng)影響客戶端,或者說(shuō)實(shí)現(xiàn)化角色的改變對(duì)客戶端是完全透明的。 一個(gè)構(gòu)件有多于一個(gè)的抽象化角色和實(shí)現(xiàn)化角色,系統(tǒng)需要它們之間進(jìn)行動(dòng)態(tài)耦合。 雖然在系統(tǒng)中使用繼承是沒(méi)有問(wèn)題的,但是由于抽象化角色和具體化角色需要獨(dú)立變化,設(shè)計(jì)要求需要獨(dú)立管理這兩者。,橋接模式,模式應(yīng)用 開(kāi)關(guān)與臺(tái)燈:任何臺(tái)燈都包括燈泡和燈架兩部分,不同的燈泡可以與不同的臺(tái)燈(燈架)匹配,可以只更換燈泡或只更換臺(tái)燈(燈架),燈泡與臺(tái)燈(燈架)之間存在一種交錯(cuò)的巨烈變化,所以把燈和臺(tái)燈“做死”在一起不是一種好的作法。可以使用橋接器模式使之解耦:在臺(tái)燈(燈架)上做一個(gè)燈口,可以用它來(lái)調(diào)用燈泡的“發(fā)光”的方法點(diǎn)亮燈泡,同時(shí)我們可以隨意地更換我們喜歡的燈泡,而不用去換整個(gè)臺(tái)燈(燈架)。,橋接模式,為了實(shí)現(xiàn)燈架與燈泡之間的解耦,我們使用橋接器模式,抽象出一個(gè)“抽象化臺(tái)燈”,它有一個(gè)開(kāi)關(guān)一個(gè)燈泡,可以通過(guò)開(kāi)關(guān)調(diào)用燈泡的發(fā)光方法來(lái)實(shí)現(xiàn)發(fā)光。同時(shí)我們也為燈泡做了一個(gè)抽象,以使此燈的燈泡可以恰好安裝在燈架的燈口上。 下面為抽象出來(lái)的燈架和燈泡派生兩個(gè)燈泡和兩個(gè)燈架: 兩個(gè)臺(tái)燈的燈架:一個(gè)是旋鈕式開(kāi)關(guān),另一個(gè)是按鈕式開(kāi)關(guān)。 兩個(gè)燈泡:紅色燈泡和藍(lán)色燈泡。,橋接模式,抽象臺(tái)燈 abstract class Lamp protected Light light; /臺(tái)燈上的燈泡 public Light Light set light = value; public abstract void OpenLight(); /臺(tái)燈的開(kāi)關(guān) ,橋接模式,旋鈕臺(tái)燈 class CircleLamp: Lamp private int v=0; /旋鈕臺(tái)燈打開(kāi)后,燈泡的最初電壓 public override void OpenLight() /旋轉(zhuǎn)臺(tái)燈開(kāi)關(guān)調(diào)亮燈泡 for (v = 0; v = 5; v+) light.Level = v; /根據(jù)電壓設(shè)定燈泡發(fā)光強(qiáng)度 light.Shine(); /燈泡發(fā)光 ,橋接模式,按鈕臺(tái)燈 class SwitchLamp : Lamp private int v = 5; /打開(kāi)臺(tái)燈開(kāi)關(guān)后,燈泡的最初電壓 public override void OpenLight() /打開(kāi)按鈕臺(tái)燈的開(kāi)關(guān) light.Level = v; /根據(jù)電壓設(shè)定燈泡發(fā)光強(qiáng)度 light.Shine();/燈泡發(fā)光 ,橋接模式,燈泡抽象體 abstract class Light protected int level; /燈泡的發(fā)光強(qiáng)度 public int Level set level = value; public abstract void Shine(); /燈泡的發(fā)光方法 ,橋接模式,紅燈 class RedLight:Ligh
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 25G-NBOMe-hydrochloride-生命科學(xué)試劑-MCE
- 水上施工承攬合同范本
- 買(mǎi)服裝合同范本
- 2025年民用高端線纜合作協(xié)議書(shū)
- 2025年英語(yǔ)教輔項(xiàng)目發(fā)展計(jì)劃
- 豪華住宅租賃合同(2篇)
- 2025年視窗防護(hù)屏合作協(xié)議書(shū)
- 人教版小學(xué)六年級(jí)下學(xué)期數(shù)學(xué)期中復(fù)習(xí)假期練習(xí)題單
- 施工變更管理安全生產(chǎn)培訓(xùn)
- 地理-天一大聯(lián)考2025屆高三四省聯(lián)考(陜晉青寧)試題和解析
- 小巴掌童話課件
- 教科版六年級(jí)科學(xué)下冊(cè)全冊(cè)教學(xué)設(shè)計(jì)教案
- 部編版小學(xué)五年級(jí)下冊(cè)《道德與法治》全冊(cè)教案含教學(xué)計(jì)劃
- 初中數(shù)學(xué)新課程標(biāo)準(zhǔn)(2024年版)
- GB/T 19342-2024手動(dòng)牙刷一般要求和檢測(cè)方法
- 2024年山東鐵投集團(tuán)招聘筆試參考題庫(kù)含答案解析
- 8款-組織架構(gòu)圖(可編輯)
- 中學(xué)生班干部培訓(xùn)方案(共4頁(yè))
- 凈土資糧——信愿行(11)第六講凈業(yè)三福變化氣質(zhì)
- 美的集團(tuán)公司分權(quán)手冊(cè)
評(píng)論
0/150
提交評(píng)論