第十章結(jié)構(gòu)型模式_第1頁
第十章結(jié)構(gòu)型模式_第2頁
第十章結(jié)構(gòu)型模式_第3頁
第十章結(jié)構(gòu)型模式_第4頁
第十章結(jié)構(gòu)型模式_第5頁
已閱讀5頁,還剩254頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、軟件體系結(jié)構(gòu)第十章 結(jié)構(gòu)型模式結(jié)構(gòu)性模式結(jié)構(gòu)性模式n概述概述q結(jié)構(gòu)型模式結(jié)構(gòu)型模式(Structural Pattern)描述描述如何將類或者對象如何將類或者對象結(jié)合在一起形成更大的結(jié)構(gòu)結(jié)合在一起形成更大的結(jié)構(gòu),就像搭積木,可以通過簡,就像搭積木,可以通過簡單積木的組合形成復(fù)雜的、功能更為強(qiáng)大的結(jié)構(gòu)。單積木的組合形成復(fù)雜的、功能更為強(qiáng)大的結(jié)構(gòu)。 結(jié)構(gòu)性模式結(jié)構(gòu)性模式n概述概述q根據(jù)這一點(diǎn),結(jié)構(gòu)型模式可以分為根據(jù)這一點(diǎn),結(jié)構(gòu)型模式可以分為類結(jié)構(gòu)型模式類結(jié)構(gòu)型模式和和對象結(jié)構(gòu)型模式對象結(jié)構(gòu)型模式:n類結(jié)構(gòu)型模式關(guān)心類的組合類結(jié)構(gòu)型模式關(guān)心類的組合,由多個類可以組合成一個更,由多個類可以組合成一個更

2、大的系統(tǒng),在類結(jié)構(gòu)型模式中一般只存在繼承關(guān)系和實(shí)現(xiàn)大的系統(tǒng),在類結(jié)構(gòu)型模式中一般只存在繼承關(guān)系和實(shí)現(xiàn)關(guān)系。關(guān)系。n對象結(jié)構(gòu)型模式關(guān)心類與對象的組合,通過關(guān)聯(lián)關(guān)系使得對象結(jié)構(gòu)型模式關(guān)心類與對象的組合,通過關(guān)聯(lián)關(guān)系使得在一個類中定義另一個類的實(shí)例對象在一個類中定義另一個類的實(shí)例對象,然后通過該對象調(diào),然后通過該對象調(diào)用其方法。根據(jù)用其方法。根據(jù)“合成復(fù)用原則合成復(fù)用原則”,在系統(tǒng)中盡量使用關(guān),在系統(tǒng)中盡量使用關(guān)聯(lián)關(guān)系來替代繼承關(guān)系,因此大部分結(jié)構(gòu)型模式都是對象聯(lián)關(guān)系來替代繼承關(guān)系,因此大部分結(jié)構(gòu)型模式都是對象結(jié)構(gòu)型模式。結(jié)構(gòu)型模式。n本章的內(nèi)容與目標(biāo)本章的內(nèi)容與目標(biāo)q適配器模式適配器模式(Adap

3、ter) q橋接模式橋接模式(Bridge) q組合模式組合模式(Composite) q裝飾模式裝飾模式(Decorator)q外觀模式外觀模式(Facade) q享元模式享元模式(Flyweight) q代理模式代理模式(Proxy) 適配器模式適配器模式n意圖意圖q適配器適配器適配器模式適配器模式n意圖意圖q適配器適配器適配器適配器適配器模式適配器模式n意圖意圖q軟件系統(tǒng)中的適配器軟件系統(tǒng)中的適配器適配器模式適配器模式n意圖意圖q軟件系統(tǒng)中的適配器軟件系統(tǒng)中的適配器適配器模式適配器模式n意圖意圖q軟件系統(tǒng)中的適配器軟件系統(tǒng)中的適配器n方法一:修改方法一:修改system或修改或修改B,都

4、違反開閉原則,都違反開閉原則適配器模式適配器模式n意圖意圖q軟件系統(tǒng)中的適配器軟件系統(tǒng)中的適配器n方法二:增加適配器方法二:增加適配器適配器模式適配器模式n意圖意圖q軟件系統(tǒng)中的適配器軟件系統(tǒng)中的適配器n方法二:增加適配器方法二:增加適配器適配器模式適配器模式n意圖意圖q在軟件開發(fā)中采用類似于電源適配器的設(shè)計(jì)和編碼技巧被稱在軟件開發(fā)中采用類似于電源適配器的設(shè)計(jì)和編碼技巧被稱為為適配器模式適配器模式。 q通常情況下,通常情況下,客戶端可以通過目標(biāo)類的接口訪問它所提供的客戶端可以通過目標(biāo)類的接口訪問它所提供的服務(wù)服務(wù)。有時,現(xiàn)有的類。有時,現(xiàn)有的類可以滿足客戶類的功能需要可以滿足客戶類的功能需要,

5、但是它,但是它所提供的所提供的接口不是客戶類所期望的接口不是客戶類所期望的,比如:現(xiàn)有類中方法名,比如:現(xiàn)有類中方法名與目標(biāo)類中定義的方法名不一致等原因所導(dǎo)致的與目標(biāo)類中定義的方法名不一致等原因所導(dǎo)致的q在這種情況下,現(xiàn)有的在這種情況下,現(xiàn)有的接口需要轉(zhuǎn)化為客戶類期望的接口接口需要轉(zhuǎn)化為客戶類期望的接口,這樣保證了對現(xiàn)有類的重用。如果不進(jìn)行這樣的轉(zhuǎn)化,客戶這樣保證了對現(xiàn)有類的重用。如果不進(jìn)行這樣的轉(zhuǎn)化,客戶類就不能利用現(xiàn)有類所提供的功能,適配器模式可以完成這類就不能利用現(xiàn)有類所提供的功能,適配器模式可以完成這樣的轉(zhuǎn)化。樣的轉(zhuǎn)化。 適配器模式適配器模式n意圖意圖q在適配器模式中可以定義一個包裝類

6、,包裝不兼容接口的對在適配器模式中可以定義一個包裝類,包裝不兼容接口的對象,這個包裝類指的就是象,這個包裝類指的就是適配器適配器(Adapter),它所包裝的對象,它所包裝的對象就是就是適配者適配者(Adaptee),即被適配的類。,即被適配的類。q適配器提供客戶類需要的接口,適配器提供客戶類需要的接口,適配器的實(shí)現(xiàn)就是把客戶類適配器的實(shí)現(xiàn)就是把客戶類的請求轉(zhuǎn)化為對適配者的相應(yīng)接口的調(diào)用的請求轉(zhuǎn)化為對適配者的相應(yīng)接口的調(diào)用。q也就是說:也就是說:當(dāng)客戶類調(diào)用適配器的方法時,在適配器類的內(nèi)當(dāng)客戶類調(diào)用適配器的方法時,在適配器類的內(nèi)部將調(diào)用適配者類的方法,而這個過程對客戶類是透明的,部將調(diào)用適配者

7、類的方法,而這個過程對客戶類是透明的,客戶類并不直接訪問適配者類??蛻纛惒⒉恢苯釉L問適配者類。q因此,因此,適配器可以使由于接口不兼容而不能交互的類可以一適配器可以使由于接口不兼容而不能交互的類可以一起工作起工作。這就是適配器模式的模式動機(jī)。這就是適配器模式的模式動機(jī)。適配器模式適配器模式n模式定義模式定義q適配器模式適配器模式(Adapter Pattern) :將一個接口轉(zhuǎn)換成客戶:將一個接口轉(zhuǎn)換成客戶希望的另一個接口,適配器模式希望的另一個接口,適配器模式使接口不兼容的那些類使接口不兼容的那些類可以一起工作可以一起工作,其別名為,其別名為包裝器包裝器(Wrapper)或變壓器或變壓器。適

8、配器模式既可以作為類結(jié)構(gòu)型模式,也可以作為對象適配器模式既可以作為類結(jié)構(gòu)型模式,也可以作為對象結(jié)構(gòu)型模式。結(jié)構(gòu)型模式。qConvert the interface of a class into another interface clients expect. Adapter lets classes work together that couldnt otherwise because of incompatible interfaces. qFrequency of use: medium high適配器模式適配器模式n模式角色模式角色qTarget:目標(biāo)抽象類:目標(biāo)抽象類qAdapt

9、er:適配器類:適配器類qAdaptee:適配者(源角色)類:適配者(源角色)類qClient:客戶類:客戶類適配器模式適配器模式n模式結(jié)構(gòu)模式結(jié)構(gòu)q類適配器類適配器:適配器與適配者是繼承關(guān)系適配器與適配者是繼承關(guān)系A(chǔ)dapter+ request ().Target+ request ().Adaptee+ specificRequest ().ClientspecificRequest();適配器模式適配器模式n模式結(jié)構(gòu)模式結(jié)構(gòu)q對象適配器:適配器與適配者是關(guān)聯(lián)關(guān)系對象適配器:適配器與適配者是關(guān)聯(lián)關(guān)系adapteeAdapter+ request ().Adaptee+ specificR

10、equest ().Clientadaptee.specificRequest();Target+ request ().適配器模式適配器模式n模式實(shí)現(xiàn)模式實(shí)現(xiàn)q類適配器的典型代碼類適配器的典型代碼public class Adapter extends Adaptee implements Targetpublic void request()specificRequest();適配器模式適配器模式n模式實(shí)現(xiàn)模式實(shí)現(xiàn)q對象適配器代碼的典型代碼對象適配器代碼的典型代碼public class Adapter extends Targetprivate Adaptee adaptee;publi

11、c Adapter(Adaptee adaptee)this.adaptee=adaptee;public void request()adaptee.specificRequest(); 適配器模式適配器模式n例例1:仿生機(jī)器人:仿生機(jī)器人n現(xiàn)需要設(shè)計(jì)一個可以模擬各種動物行為的機(jī)器人,在機(jī)現(xiàn)需要設(shè)計(jì)一個可以模擬各種動物行為的機(jī)器人,在機(jī)器人中定義了一系列方法,如機(jī)器人叫喊方法器人中定義了一系列方法,如機(jī)器人叫喊方法cry()、機(jī)器人移動方法機(jī)器人移動方法move()等。如果希望在不修改已有代碼等。如果希望在不修改已有代碼的基礎(chǔ)上使得機(jī)器人能夠像狗一樣叫,像狗一樣跑,使的基礎(chǔ)上使得機(jī)器人能夠像

12、狗一樣叫,像狗一樣跑,使用適配器模式進(jìn)行系統(tǒng)設(shè)計(jì)用適配器模式進(jìn)行系統(tǒng)設(shè)計(jì)適配器模式適配器模式n例例1:仿生機(jī)器人:仿生機(jī)器人 DogAdapter+cry ()move ().: void: voidRobot+cry ()move ().: void: voidDog+wang ()run ().: void: void適配器模式適配器模式n例例1:仿生機(jī)器人:仿生機(jī)器人q目標(biāo)類:目標(biāo)類:Robot接口接口 public interface Robotpublic void cry();public void move();適配器模式適配器模式n例例1:仿生機(jī)器人:仿生機(jī)器人q適配者類:適配

13、者類:dog類類 public class Dogpublic void wang()System.out.println(狗汪汪叫!狗汪汪叫!);public void run()System.out.println(狗快快跑!狗快快跑!);適配器模式適配器模式n例例1:仿生機(jī)器人:仿生機(jī)器人q適配器類:適配器類:dog類類 public class DogAdapter extends Dog implements Robotpublic void cry()System.out.print(機(jī)器人模仿:機(jī)器人模仿:);super.wang();public void move() Sys

14、tem.out.print(機(jī)器人模仿:機(jī)器人模仿:);super.run();適配器模式適配器模式n例例1:仿生機(jī)器人:仿生機(jī)器人q客戶端客戶端public class Clientpublic static void main(String args)Robot robot=(Robot)XMLUtil.getBean();robot.cry();robot.move(); DogAdapter適配器模式適配器模式n例例2:加密適配器:加密適配器q某系統(tǒng)需要提供一個加密模塊,將用戶信息(如密碼等某系統(tǒng)需要提供一個加密模塊,將用戶信息(如密碼等機(jī)密信息)加密之后再存儲在數(shù)據(jù)庫中,系統(tǒng)已經(jīng)定義

15、機(jī)密信息)加密之后再存儲在數(shù)據(jù)庫中,系統(tǒng)已經(jīng)定義好了數(shù)據(jù)庫操作類。好了數(shù)據(jù)庫操作類。q為了提高開發(fā)效率,現(xiàn)需要重用已有的加密算法,這些為了提高開發(fā)效率,現(xiàn)需要重用已有的加密算法,這些算法封裝在一些由第三方提供的類中,有些甚至沒有源算法封裝在一些由第三方提供的類中,有些甚至沒有源代碼。代碼。q使用適配器模式設(shè)計(jì)該加密模塊,實(shí)現(xiàn)在不修改現(xiàn)有類使用適配器模式設(shè)計(jì)該加密模塊,實(shí)現(xiàn)在不修改現(xiàn)有類的基礎(chǔ)上重用第三方加密方法。的基礎(chǔ)上重用第三方加密方法。適配器模式適配器模式n例例2:加密適配器:加密適配器ciphercipherDataOperatorabstract - password : String

16、+setPassword (String password)getPassword ()doEncrypt (int key, String ps).: void: String: StringCipherAdapter- cipher : Caesar+CipherAdapter ()doEncrypt (int key, String ps).: StringNewCipherAdapter- cipher : NewCipher+NewCipherAdapter ()doEncrypt (int key, String ps).: StringCaesar+ doEncrypt (int

17、 key, String ps).: StringNewCipher+ doEncrypt (int key, String ps).: String適配器模式適配器模式n例例2:加密適配器:加密適配器q目標(biāo)類:目標(biāo)類: DataOperationpublic abstract class DataOperationprivate String password;public void setPassword(String password)this.password=password;public String getPassword()return this.password;public

18、 abstract String doEncrypt(int key,String ps);適配器模式適配器模式n例例2:加密適配器:加密適配器q適配者類:適配者類: Caesarpublic final class Caesar public String doEncrypt(int key,String ps) String es=;for(int i=0;i=a&cz) c-=26;if(c=A&cZ) c-=26;if(cA) c+=26;es+=c;return es;適配器模式適配器模式n例例2:加密適配器:加密適配器q適配器類:適配器類: CipherAdapter public

19、 class CipherAdapter extends DataOperationprivate Caesar cipher;public CipherAdapter()cipher=new Caesar();public String doEncrypt(int key,String ps)return cipher.doEncrypt(key,ps);適配器模式適配器模式n例例2:加密適配器:加密適配器q新適配者類:新適配者類: NewCipherpublic final class NewCipherpublic String doEncrypt(int key,String ps)

20、String es=;for(int i=0;ips.length();i+)String c=String.valueOf(ps.charAt(i)%key);es+=c;return es;適配器模式適配器模式n例例2:加密適配器:加密適配器q新適配器類:新適配器類: NewCipherAdapter public class NewCipherAdapter extends DataOperationprivate NewCipher cipher;public NewCipherAdapter()cipher=new NewCipher();public String doEncryp

21、t(int key,String ps)return cipher.doEncrypt(key,ps);適配器模式適配器模式n例例2:加密適配器:加密適配器q客戶端類:客戶端類: public class Clientpublic static void main(String args) DataOperation dao=(DataOperation)XMLUtil.getBean();dao.setPassword(sunnyLiu);String ps=dao.getPassword();String es=dao.doEncrypt(6,ps);System.out.println(

22、明文為:明文為: + ps);System.out.println(密文為:密文為: + es);適配器模式適配器模式n評價評價q總體優(yōu)點(diǎn):總體優(yōu)點(diǎn):n將目標(biāo)類和適配者類解耦將目標(biāo)類和適配者類解耦,通過引入一個適配器類來重用,通過引入一個適配器類來重用現(xiàn)有的適配者類,而無需修改原有代碼?,F(xiàn)有的適配者類,而無需修改原有代碼。n增加了類的透明性和復(fù)用性增加了類的透明性和復(fù)用性,將具體的實(shí)現(xiàn)封裝在適配者,將具體的實(shí)現(xiàn)封裝在適配者類中,對于客戶端類來說是透明的,而且提高了適配者的類中,對于客戶端類來說是透明的,而且提高了適配者的復(fù)用性。復(fù)用性。n靈活性和擴(kuò)展性都非常好靈活性和擴(kuò)展性都非常好,通過使用配

23、置文件,可以很方,通過使用配置文件,可以很方便地更換適配器,也可以在不修改原有代碼的基礎(chǔ)上增加便地更換適配器,也可以在不修改原有代碼的基礎(chǔ)上增加新的適配器類,完全符合新的適配器類,完全符合“開閉原則開閉原則”。適配器模式適配器模式n評價評價q類適配器優(yōu)點(diǎn):類適配器優(yōu)點(diǎn):n由于適配器類是適配者類的子類,因此由于適配器類是適配者類的子類,因此可以在適配器類中可以在適配器類中置換一些適配者的方法置換一些適配者的方法,使得適配器的靈活性更強(qiáng)。,使得適配器的靈活性更強(qiáng)。q類適配器缺點(diǎn):類適配器缺點(diǎn):n對于對于Java、C#等不支持多重繼承的語言,一次最多只能等不支持多重繼承的語言,一次最多只能適配一個適

24、配者類,而且目標(biāo)抽象類只能為抽象類,不能適配一個適配者類,而且目標(biāo)抽象類只能為抽象類,不能為具體類,為具體類,其使用有一定的局限性其使用有一定的局限性,不能將一個適配者類,不能將一個適配者類和它的子類都適配到目標(biāo)接口。和它的子類都適配到目標(biāo)接口。適配器模式適配器模式n評價評價q對象適配器優(yōu)點(diǎn):對象適配器優(yōu)點(diǎn):n一個對象適配器可以把多個不同的適配者適配到同一個目一個對象適配器可以把多個不同的適配者適配到同一個目標(biāo),也就是說,標(biāo),也就是說,同一個適配器可以把適配者類和它的子類同一個適配器可以把適配者類和它的子類都適配到目標(biāo)接口都適配到目標(biāo)接口。q對象適配器缺點(diǎn):對象適配器缺點(diǎn):n與類適配器模式相比

25、,與類適配器模式相比,要想置換適配者類的方法就不容易要想置換適配者類的方法就不容易。如果一定要置換掉適配者類的一個或多個方法,就只好。如果一定要置換掉適配者類的一個或多個方法,就只好先做一個適配者類的子類,將適配者類的方法置換掉,然先做一個適配者類的子類,將適配者類的方法置換掉,然后再把適配者類的子類當(dāng)做真正的適配者進(jìn)行適配,實(shí)現(xiàn)后再把適配者類的子類當(dāng)做真正的適配者進(jìn)行適配,實(shí)現(xiàn)過程較為復(fù)雜。過程較為復(fù)雜。適配器模式適配器模式n評價評價q適用環(huán)境:適用環(huán)境:n系統(tǒng)系統(tǒng)需要使用現(xiàn)有的類需要使用現(xiàn)有的類,而,而這些類的接口不符合系這些類的接口不符合系統(tǒng)的需要統(tǒng)的需要。n想要建立一個可以重復(fù)使用的類

26、,用于與一些彼此想要建立一個可以重復(fù)使用的類,用于與一些彼此之間沒有太大關(guān)聯(lián)的一些類之間沒有太大關(guān)聯(lián)的一些類,包括一些可能在將來,包括一些可能在將來引進(jìn)的類引進(jìn)的類一起工作一起工作。適配器模式適配器模式n模式擴(kuò)展模式擴(kuò)展q缺省適配器模式缺省適配器模式(Default Adapter Pattern)n存在一個功能強(qiáng)大的接口,但很多時候只需要實(shí)現(xiàn)和使用存在一個功能強(qiáng)大的接口,但很多時候只需要實(shí)現(xiàn)和使用其中的一部分方法其中的一部分方法n可先設(shè)計(jì)一個可先設(shè)計(jì)一個抽象類實(shí)現(xiàn)接口抽象類實(shí)現(xiàn)接口,并,并為該接口中每個方法提為該接口中每個方法提供一個默認(rèn)實(shí)現(xiàn)(空方法)。供一個默認(rèn)實(shí)現(xiàn)(空方法)。n然后,該抽

27、象類的子類可有選擇地覆蓋父類的某些方法來然后,該抽象類的子類可有選擇地覆蓋父類的某些方法來實(shí)現(xiàn)需求,它實(shí)現(xiàn)需求,它適用于一個接口不想使用其所有的方法的情適用于一個接口不想使用其所有的方法的情況況。n這種方式稱為缺省適配器模式,是適配器類型的簡化,也這種方式稱為缺省適配器模式,是適配器類型的簡化,也稱為稱為單接口適配器模式單接口適配器模式。 適配器模式適配器模式n模式擴(kuò)展模式擴(kuò)展q缺省適配器模式缺省適配器模式n適配者接口適配者接口 n缺省適配器類缺省適配器類 n具體業(yè)務(wù)類具體業(yè)務(wù)類 適配器模式適配器模式n模式擴(kuò)展模式擴(kuò)展q缺省適配器模式缺省適配器模式WindowAdapterabstract +

28、windowOpened (WindowEvent e)windowClosing (WindowEvent e)windowClosed (WindowEvent e)windowIconified (WindowEvent e)windowDeiconified (WindowEvent e)windowActivated (WindowEvent e)windowDeactivated4 (WindowEvent e)windowStateChanged (WindowEvent e)windowGainedFocus (WindowEvent e)windowLostFocus (Wi

29、ndowEvent e): void: void: void: void: void: void: void: void: void: voidWindowListener+windowOpened (WindowEvent e)windowClosing (WindowEvent e)windowClosed (WindowEvent e)windowIconified (WindowEvent e)windowDeiconified (WindowEvent e)windowActivated (WindowEvent e)windowDeactivated (WindowEvent e)

30、.: void: void: void: void: void: void: void適配器模式適配器模式n模式擴(kuò)展模式擴(kuò)展q雙向適配器雙向適配器 n在對象適配器的使用過程中,如果在對象適配器的使用過程中,如果在適配器中同時包含對在適配器中同時包含對目標(biāo)類和適配者類的引用目標(biāo)類和適配者類的引用,適配者可以通過它調(diào)用目標(biāo)類適配者可以通過它調(diào)用目標(biāo)類中的方法,目標(biāo)類也可以通過它調(diào)用適配者類中的方法中的方法,目標(biāo)類也可以通過它調(diào)用適配者類中的方法,那么該適配器就是一個那么該適配器就是一個雙向適配器雙向適配器。適配器模式適配器模式n模式擴(kuò)展模式擴(kuò)展q雙向適配器雙向適配器 adapteetargetAd

31、apter-adapteetarget: Adaptee: Target+request ()specificRequest ()setTarget (Target target)setAdaptee (Adaptee adaptee).Target+ request ().adaptee.specificRequest();Adaptee+ specificRequest ().target.request();ConcreteTarget+ request ().ConcreteAdaptee+ specificRequest ().橋接模式橋接模式n意圖意圖橋接模式橋接模式n意圖意圖q現(xiàn)

32、需要提供大中小現(xiàn)需要提供大中小3種型號的畫筆,能夠繪制種型號的畫筆,能夠繪制5種不同顏種不同顏色。色。如果使用蠟筆,需要多少支蠟筆?如果使用蠟筆,需要多少支蠟筆?如果使用毛筆,需要多少支毛筆?如果使用毛筆,需要多少支毛筆?毛筆和蠟筆的區(qū)別是什么?毛筆和蠟筆的區(qū)別是什么?橋接模式橋接模式n意圖意圖q設(shè)想如果要繪制矩形、圓形、橢圓、正方形,我們設(shè)想如果要繪制矩形、圓形、橢圓、正方形,我們至少需要至少需要4個形狀類,但是如果繪制的圖形需要具個形狀類,但是如果繪制的圖形需要具有不同的顏色,如紅色、綠色、藍(lán)色等,此時至少有不同的顏色,如紅色、綠色、藍(lán)色等,此時至少有如下兩種設(shè)計(jì)方案:有如下兩種設(shè)計(jì)方案:

33、 n第一種設(shè)計(jì)方案是為每一種形狀都提供一套各種顏色的版第一種設(shè)計(jì)方案是為每一種形狀都提供一套各種顏色的版本。本。n第二種設(shè)計(jì)方案是根據(jù)實(shí)際需要對形狀和顏色進(jìn)行組合。第二種設(shè)計(jì)方案是根據(jù)實(shí)際需要對形狀和顏色進(jìn)行組合。 橋接模式橋接模式n意圖意圖12橋接模式橋接模式n意圖意圖q對于有對于有兩個變化維度兩個變化維度(即兩個變化的原因)的系統(tǒng),采(即兩個變化的原因)的系統(tǒng),采用用方案二方案二來進(jìn)行設(shè)計(jì)系統(tǒng)中類的個數(shù)更少,且系統(tǒng)擴(kuò)展來進(jìn)行設(shè)計(jì)系統(tǒng)中類的個數(shù)更少,且系統(tǒng)擴(kuò)展更為方便。設(shè)計(jì)方案二即是橋接模式的應(yīng)用。更為方便。設(shè)計(jì)方案二即是橋接模式的應(yīng)用。q橋接模式橋接模式將繼承關(guān)系轉(zhuǎn)換為關(guān)聯(lián)關(guān)系將繼承關(guān)系轉(zhuǎn)

34、換為關(guān)聯(lián)關(guān)系,從而,從而降低了類與降低了類與類之間的耦合類之間的耦合,減少了代碼編寫量減少了代碼編寫量。 橋接模式橋接模式n意圖意圖橋接模式橋接模式n模式定義模式定義n橋接模式橋接模式(Bridge Pattern):將抽象部分與它的實(shí)現(xiàn)部分將抽象部分與它的實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立地變化分離,使它們都可以獨(dú)立地變化。它是一種對象結(jié)構(gòu)型。它是一種對象結(jié)構(gòu)型模式,又稱為柄體模式,又稱為柄體(Handle and Body)模式或接口模式或接口(Interface)模式。模式。nBridge Pattern: Decouple an abstraction from its implement

35、ation so that the two can vary independently. nFrequency of use: medium橋接模式橋接模式n模式定義模式定義q橋接模式的核心在于橋接模式的核心在于抽象化抽象化與與實(shí)現(xiàn)化實(shí)現(xiàn)化 脫耦脫耦。q抽象化抽象化:在面向?qū)ο笾?,:在面向?qū)ο笾?,將對象的共同性質(zhì)抽取出來形成類的過將對象的共同性質(zhì)抽取出來形成類的過程程即為抽象化的過程。即為抽象化的過程。 q實(shí)現(xiàn)化實(shí)現(xiàn)化:針對抽象化給出的具體實(shí)現(xiàn),就是實(shí)現(xiàn)化。針對抽象化給出的具體實(shí)現(xiàn),就是實(shí)現(xiàn)化。實(shí)現(xiàn)化產(chǎn)生實(shí)現(xiàn)化產(chǎn)生的對象比抽象化更具體,是對抽象化事物的進(jìn)一步具體化的產(chǎn)物。的對象比抽象化更具體

36、,是對抽象化事物的進(jìn)一步具體化的產(chǎn)物。q脫耦脫耦:脫耦就是:脫耦就是將抽象化和實(shí)現(xiàn)化之間的耦合解脫開,或者說是將抽象化和實(shí)現(xiàn)化之間的耦合解脫開,或者說是將它們之間的強(qiáng)關(guān)聯(lián)改換成弱關(guān)聯(lián)將它們之間的強(qiáng)關(guān)聯(lián)改換成弱關(guān)聯(lián),將兩個角色之間的繼承關(guān)系將兩個角色之間的繼承關(guān)系改為關(guān)聯(lián)關(guān)系改為關(guān)聯(lián)關(guān)系q簡單地說:脫耦,就是在軟件系統(tǒng)的抽象化和實(shí)現(xiàn)化之間使用關(guān)簡單地說:脫耦,就是在軟件系統(tǒng)的抽象化和實(shí)現(xiàn)化之間使用關(guān)聯(lián)關(guān)系(組合或者聚合關(guān)系)而不是繼承關(guān)系(合成復(fù)用原則)。聯(lián)關(guān)系(組合或者聚合關(guān)系)而不是繼承關(guān)系(合成復(fù)用原則)。 橋接模式橋接模式n模式結(jié)構(gòu)模式結(jié)構(gòu)implClientAbstraction+ o

37、peration ().Implementor+ operationImpl ().RefinedAbstraction+ operation ().ConcreteImplementorA+ operationImpl ().ConcreteImplementorB+ operationImpl ().橋接模式橋接模式n角色:角色:qAbstraction:抽象類:抽象類qRefinedAbstraction:擴(kuò)充抽象類:擴(kuò)充抽象類qImplementor:實(shí)現(xiàn)類接口:實(shí)現(xiàn)類接口qConcreteImplementor:具體實(shí)現(xiàn)類:具體實(shí)現(xiàn)類 橋接模式橋接模式n模式實(shí)現(xiàn)模式實(shí)現(xiàn)qImplem

38、entor實(shí)現(xiàn)類接口代碼:實(shí)現(xiàn)類接口代碼:public interface Implementorpublic void operationImpl(); 橋接模式橋接模式n模式實(shí)現(xiàn)模式實(shí)現(xiàn)qAbstraction抽象類代碼:抽象類代碼:public abstract class Abstractionprotected Implementor impl;public void setImpl(Implementor impl)this.impl=impl;public abstract void operation(); 橋接模式橋接模式n模式實(shí)現(xiàn)模式實(shí)現(xiàn)qRefinedAbstractio

39、n擴(kuò)充抽象類代碼:擴(kuò)充抽象類代碼:public class RefinedAbstraction extends Abstractionpublic void operation()/代碼代碼impl.operationImpl();/代碼代碼 橋接模式橋接模式n例例1:模擬毛筆:模擬毛筆q現(xiàn)需要提供大中小現(xiàn)需要提供大中小3種型號的畫筆,能夠繪制種型號的畫筆,能夠繪制5種不同顏種不同顏色。色。q如果使用蠟筆,我們需要準(zhǔn)備如果使用蠟筆,我們需要準(zhǔn)備3*5=15支蠟筆,也就是說支蠟筆,也就是說必須準(zhǔn)備必須準(zhǔn)備15個具體的蠟筆類。個具體的蠟筆類。q而如果使用毛筆的話,只需要而如果使用毛筆的話,只需要

40、3種型號的毛筆,外加種型號的毛筆,外加5個個顏料盒,用顏料盒,用3+5=8個類就可以實(shí)現(xiàn)個類就可以實(shí)現(xiàn)15支蠟筆的功能。支蠟筆的功能。q本實(shí)例使用橋接模式來模擬毛筆的使用過程。本實(shí)例使用橋接模式來模擬毛筆的使用過程。橋接模式橋接模式n例例1:模擬毛筆:模擬毛筆colorPenabstract # color : Color+setColor (Color color)draw (String name).: void: voidColor+ bepaint (String penType, String name).: voidSmallPen+ draw (String name).: vo

41、idRed+ bepaint (String penType, String name).: voidMiddlePen+ draw (String name).: voidBigPen+ draw (String name).: voidGreen+ bepaint (String penType, String name).: voidBlue+ bepaint (String penType, String name).: voidWhite+ bepaint (String penType, String name).: voidBlack+ bepaint (String penTy

42、pe, String name).: void橋接模式橋接模式n例例1:模擬毛筆:模擬毛筆qAbstraction抽象類抽象類public abstract class Penprotected Color color;public void setColor(Color color)this.color=color;public abstract void draw(String name); 橋接模式橋接模式n例例1:模擬毛筆:模擬毛筆qRefinedAbstraction擴(kuò)充抽象類擴(kuò)充抽象類n大號毛筆大號毛筆public class BigPen extends Penpublic vo

43、id draw(String name)String penType=大號毛筆畫大家伙大號毛筆畫大家伙:;this.color.bepaint(penType,name);橋接模式橋接模式n例例1:模擬毛筆:模擬毛筆qRefinedAbstraction擴(kuò)充抽象類擴(kuò)充抽象類n中號毛筆中號毛筆public class MiddlePen extends Penpublic void draw(String name)String penType=“一般的圖形用中號毛筆一般的圖形用中號毛筆:;this.color.bepaint(penType,name);橋接模式橋接模式n例例1:模擬毛筆:模擬

44、毛筆qRefinedAbstraction擴(kuò)充擴(kuò)充抽象類抽象類n小號毛筆小號毛筆public class SmallPen extends Penpublic void draw(String name)String penType=“小號毛筆畫精細(xì)圖像小號毛筆畫精細(xì)圖像:;this.color.bepaint(penType,name);橋接模式橋接模式n例例1:模擬毛筆:模擬毛筆qImplementor實(shí)現(xiàn)類接口實(shí)現(xiàn)類接口n顏色接口顏色接口public interface Colorvoid bepaint(String penType,String name);橋接模式橋接模式n例例1:

45、模擬毛筆:模擬毛筆qConcreteImplementor:具體實(shí)現(xiàn)類:具體實(shí)現(xiàn)類n紅色紅色public class Red implements Colorpublic void bepaint(String penType,String name)System.out.println(penType + 紅色的紅色的+ name + .);橋接模式橋接模式n例例1:模擬毛筆:模擬毛筆qConcreteImplementor:具體實(shí)現(xiàn)類:具體實(shí)現(xiàn)類n黑色黑色public class Black implements Colorpublic void bepaint(String penTyp

46、e,String name)System.out.println(penType + 黑色的黑色的+ name + .);其他顏色類似其他顏色類似橋接模式橋接模式n例例1:模擬毛筆:模擬毛筆q客戶端類客戶端類public class Clientpublic static void main(String a)Color color;Pen pen;color=(Color)XMLUtilPen.getBean(color);pen=(Pen)XMLUtilPen.getBean(pen);pen.setColor(color);pen.draw(鮮花鮮花); White SmallPen橋接

47、模式橋接模式n例例2:我是山寨我怕誰:我是山寨我怕誰q某公司,原來是做房地產(chǎn)的,通常都是豆腐渣。國某公司,原來是做房地產(chǎn)的,通常都是豆腐渣。國家調(diào)控以后,生存不易,決定轉(zhuǎn)向家調(diào)控以后,生存不易,決定轉(zhuǎn)向IT行業(yè)。行業(yè)。q不會做,怎么辦?老板說不會做,怎么辦?老板說“沒關(guān)系,先做山寨沒關(guān)系,先做山寨”,隨便找?guī)讉€人,先山寨隨便找?guī)讉€人,先山寨IPodq用橋接模式模擬該過程用橋接模式模擬該過程n要可以隨意更換山寨產(chǎn)品要可以隨意更換山寨產(chǎn)品n有一天有實(shí)力了,要能夠做改頭換面,生產(chǎn)好的產(chǎn)品有一天有實(shí)力了,要能夠做改頭換面,生產(chǎn)好的產(chǎn)品橋接模式橋接模式n例例2:我是山寨我怕誰:我是山寨我怕誰橋接模式橋接

48、模式n例例2:我是山寨我怕誰:我是山寨我怕誰q抽象實(shí)現(xiàn)類抽象實(shí)現(xiàn)類橋接模式橋接模式n例例2:我是山寨我怕誰:我是山寨我怕誰q具體實(shí)現(xiàn)類具體實(shí)現(xiàn)類橋接模式橋接模式n例例2:我是山寨我怕誰:我是山寨我怕誰q具體實(shí)現(xiàn)類具體實(shí)現(xiàn)類橋接模式橋接模式n例例2:我是山寨我怕誰:我是山寨我怕誰q抽象類:公司抽象類:公司橋接模式橋接模式n例例2:我是山寨我怕誰:我是山寨我怕誰q擴(kuò)充抽象類:房地產(chǎn)公司擴(kuò)充抽象類:房地產(chǎn)公司橋接模式橋接模式n例例2:我是山寨我怕誰:我是山寨我怕誰q擴(kuò)充抽象類:山寨公司擴(kuò)充抽象類:山寨公司橋接模式橋接模式n例例2:我是山寨我怕誰:我是山寨我怕誰q客戶端客戶端橋接模式橋接模式n評價評價

49、q優(yōu)點(diǎn)優(yōu)點(diǎn)n分離抽象接口及其實(shí)現(xiàn)部分分離抽象接口及其實(shí)現(xiàn)部分。n橋接模式有時類似于多繼承方案,但是多繼承方案違背了橋接模式有時類似于多繼承方案,但是多繼承方案違背了類的單一職責(zé)原則(即一個類只有一個變化的原因),復(fù)類的單一職責(zé)原則(即一個類只有一個變化的原因),復(fù)用性比較差,而且多繼承結(jié)構(gòu)中類的個數(shù)非常龐大,用性比較差,而且多繼承結(jié)構(gòu)中類的個數(shù)非常龐大,橋接橋接模式是比多繼承方案更好的解決方法模式是比多繼承方案更好的解決方法。 n橋接模式橋接模式提高了系統(tǒng)的可擴(kuò)充性提高了系統(tǒng)的可擴(kuò)充性,在兩個變化維度中任意,在兩個變化維度中任意擴(kuò)展一個維度,都不需要修改原有系統(tǒng)。擴(kuò)展一個維度,都不需要修改原有

50、系統(tǒng)。n實(shí)現(xiàn)細(xì)節(jié)對客戶透明,可以對用戶隱藏實(shí)現(xiàn)細(xì)節(jié)實(shí)現(xiàn)細(xì)節(jié)對客戶透明,可以對用戶隱藏實(shí)現(xiàn)細(xì)節(jié)。 橋接模式橋接模式n評價評價q缺點(diǎn)缺點(diǎn)n橋接模式的引入會橋接模式的引入會增加系統(tǒng)的理解與設(shè)計(jì)難度增加系統(tǒng)的理解與設(shè)計(jì)難度,由,由于聚合關(guān)聯(lián)關(guān)系建立在抽象層,要求開發(fā)者針對抽于聚合關(guān)聯(lián)關(guān)系建立在抽象層,要求開發(fā)者針對抽象進(jìn)行設(shè)計(jì)與編程。象進(jìn)行設(shè)計(jì)與編程。n橋接模式要求正確識別出系統(tǒng)中兩個獨(dú)立變化的維橋接模式要求正確識別出系統(tǒng)中兩個獨(dú)立變化的維度,因此度,因此其使用范圍具有一定的局限性其使用范圍具有一定的局限性。 橋接模式橋接模式n評價評價q適用環(huán)境:適用環(huán)境:n如果系統(tǒng)如果系統(tǒng)需要在構(gòu)件的抽象化角色和具

51、體化角色之間增加靈活性需要在構(gòu)件的抽象化角色和具體化角色之間增加靈活性,避免靜態(tài)的繼承聯(lián)系避免靜態(tài)的繼承聯(lián)系,橋接模式可以在抽象層建立關(guān)聯(lián)關(guān)系。,橋接模式可以在抽象層建立關(guān)聯(lián)關(guān)系。n抽象化角色和實(shí)現(xiàn)化角色可以以繼承的方式獨(dú)立擴(kuò)展而互不影響抽象化角色和實(shí)現(xiàn)化角色可以以繼承的方式獨(dú)立擴(kuò)展而互不影響,在程序運(yùn)行時可以動態(tài)將抽象化子類的對象和實(shí)現(xiàn)化子類的對象在程序運(yùn)行時可以動態(tài)將抽象化子類的對象和實(shí)現(xiàn)化子類的對象進(jìn)行組合,即系統(tǒng)需要對抽象化角色和實(shí)現(xiàn)化角色進(jìn)行動態(tài)耦合。進(jìn)行組合,即系統(tǒng)需要對抽象化角色和實(shí)現(xiàn)化角色進(jìn)行動態(tài)耦合。n一個類一個類存在兩個獨(dú)立變化的維度存在兩個獨(dú)立變化的維度,且兩個維度都需要

52、進(jìn)行擴(kuò)展。,且兩個維度都需要進(jìn)行擴(kuò)展。n雖然在系統(tǒng)中使用繼承是沒有問題的,但是由于抽象化角色和具雖然在系統(tǒng)中使用繼承是沒有問題的,但是由于抽象化角色和具體化角色需要獨(dú)立變化,設(shè)計(jì)要求需要獨(dú)立管理這兩者。體化角色需要獨(dú)立變化,設(shè)計(jì)要求需要獨(dú)立管理這兩者。n對于那些對于那些不希望使用繼承或因?yàn)槎鄬哟卫^承導(dǎo)致系統(tǒng)類的個數(shù)急不希望使用繼承或因?yàn)槎鄬哟卫^承導(dǎo)致系統(tǒng)類的個數(shù)急劇增加的系統(tǒng)劇增加的系統(tǒng),橋接模式尤為適用。,橋接模式尤為適用。橋接模式橋接模式n模式擴(kuò)展模式擴(kuò)展q適配器模式與橋接模式的聯(lián)用適配器模式與橋接模式的聯(lián)用 n橋接模式和適配器模式用于設(shè)計(jì)的不同階段,橋接模式和適配器模式用于設(shè)計(jì)的不同階段

53、,橋接模式用橋接模式用于系統(tǒng)的初步設(shè)計(jì)于系統(tǒng)的初步設(shè)計(jì),對于存在兩個獨(dú)立變化維度的類可以,對于存在兩個獨(dú)立變化維度的類可以將其分為抽象化和實(shí)現(xiàn)化兩個角色,使它們可以分別進(jìn)行將其分為抽象化和實(shí)現(xiàn)化兩個角色,使它們可以分別進(jìn)行變化;變化;n而在初步設(shè)計(jì)完成之后,而在初步設(shè)計(jì)完成之后,當(dāng)發(fā)現(xiàn)系統(tǒng)與已有類無法協(xié)同工當(dāng)發(fā)現(xiàn)系統(tǒng)與已有類無法協(xié)同工作時,可以采用適配器模式作時,可以采用適配器模式。但有時候在設(shè)計(jì)初期也需要。但有時候在設(shè)計(jì)初期也需要考慮適配器模式,特別是那些涉及到大量第三方應(yīng)用接口考慮適配器模式,特別是那些涉及到大量第三方應(yīng)用接口的情況。的情況。橋接模式橋接模式n模式擴(kuò)展模式擴(kuò)展q適配器模式與

54、橋接模式的聯(lián)用適配器模式與橋接模式的聯(lián)用橋接模式橋接模式n典型應(yīng)用典型應(yīng)用qJava虛擬機(jī)虛擬機(jī)橋接模式橋接模式n典型應(yīng)用典型應(yīng)用q類似的,許多跨平臺軟件類似的,許多跨平臺軟件n如:視頻播放器如:視頻播放器Abstract MethodvfOperatingSystemVersionabstract # vf : VideoFile+setVideoFile (VideoFile vf)play (String fileName).: void: voidVideoFile+ decode (String osType, String fileName).: voidWindowsVersio

55、n+ play (String fileName).: voidMPEGFile+ decode (String osType, String fileName).: voidLinuxVersion+ play (String fileName).: voidUnixVersion+ play (String fileName).: voidRMVBFile+ decode (String osType, String fileName).: voidWMVFile+ decode (String osType, String fileName).: voidAVIFile+ decode

56、(String osType, String fileName).: void組合模式組合模式n意圖意圖q情人節(jié)的禮物情人節(jié)的禮物組合組合組合模式組合模式n意圖意圖q更復(fù)雜的組合:企業(yè)的組織結(jié)構(gòu)更復(fù)雜的組合:企業(yè)的組織結(jié)構(gòu)組合模式組合模式n意圖意圖組合模式組合模式n意圖意圖q組合模式是一個處理組合模式是一個處理樹形結(jié)構(gòu)樹形結(jié)構(gòu)的模式。的模式。 樹:樹:分支結(jié)點(diǎn)分支結(jié)點(diǎn)和和葉子結(jié)點(diǎn)葉子結(jié)點(diǎn), 組合模式:組合模式:容器對象容器對象和和葉子對象葉子對象q組合模式描述了組合模式描述了如何將容器對象和葉子對象進(jìn)行遞歸組如何將容器對象和葉子對象進(jìn)行遞歸組合合,即,即整體整體-部分部分的關(guān)系的關(guān)系組合模式組

57、合模式n意圖意圖q由于容器對象和葉子對象在功能上的區(qū)別,在使用這些由于容器對象和葉子對象在功能上的區(qū)別,在使用這些對象的客戶端代碼中必須對象的客戶端代碼中必須有區(qū)別地對待容器對象和葉子有區(qū)別地對待容器對象和葉子對象對象,而實(shí)際上,而實(shí)際上大多數(shù)情況下客戶端希望一致地處理它大多數(shù)情況下客戶端希望一致地處理它們們,因?yàn)閷τ谶@些對象的區(qū)別對待將會使得程序非常復(fù)因?yàn)閷τ谶@些對象的區(qū)別對待將會使得程序非常復(fù)雜雜。q組合模式使得客戶端把一個個組合模式使得客戶端把一個個單獨(dú)的成分對象單獨(dú)的成分對象和由他們和由他們復(fù)合而成的合成對象同等看待復(fù)合而成的合成對象同等看待。使得。使得用戶在使用時無須用戶在使用時無須

58、對它們進(jìn)行區(qū)分對它們進(jìn)行區(qū)分,可以,可以一致地對待容器對象和葉子對象一致地對待容器對象和葉子對象。組合模式組合模式n模式定義模式定義q組合模式組合模式(Composite Pattern):組合多個對象形成:組合多個對象形成樹形樹形結(jié)構(gòu)結(jié)構(gòu)以以表示表示“整體整體-部分部分”的結(jié)構(gòu)層次的結(jié)構(gòu)層次。組合模式對。組合模式對單單個對象(即葉子對象)個對象(即葉子對象)和和組合對象(即容器對象)組合對象(即容器對象)的的使使用具有一致性用具有一致性。q組合模式又可以稱為組合模式又可以稱為“整體整體-部分部分”(Part-Whole)模式模式,屬于對象的結(jié)構(gòu)模式,它屬于對象的結(jié)構(gòu)模式,它將對象組織到樹結(jié)構(gòu)

59、中,可以將對象組織到樹結(jié)構(gòu)中,可以用來描述整體與部分的關(guān)系用來描述整體與部分的關(guān)系。組合模式組合模式n模式定義模式定義qComposite Pattern: Compose objects into tree structures to represent part-whole hierarchies. Composite lets clients treat individual objects and compositions of objects uniformly. q Frequency of use: medium high 組合模式組合模式n模式角色模式角色qComponent:

60、 抽象構(gòu)件抽象構(gòu)件qLeaf: 葉子構(gòu)件葉子構(gòu)件qComposite: 容器構(gòu)件容器構(gòu)件(分支構(gòu)件)分支構(gòu)件)qClient: 客戶類客戶類組合模式組合模式n模式結(jié)構(gòu)模式結(jié)構(gòu)childrenClientComponent+operation ()add (Component c)remove (Component c)getChild (int i).Leaf+ operation ().Composite+operation ()add (Component c)remove (Component c)getChild (int i).for(Component child:children

溫馨提示

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

評論

0/150

提交評論