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

下載本文檔

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

文檔簡介

1、第5章 結(jié)構(gòu)型模式(下)作者:程細(xì)柱韶關(guān)學(xué)院信息科學(xué)與工程學(xué)院內(nèi)容簡介 本章教學(xué)目標(biāo):進(jìn)一步理解結(jié)構(gòu)型模式的優(yōu)缺點(diǎn);明白裝飾模式、外觀模式、享元模式、組合模式的定義與特點(diǎn);掌握裝飾模式、外觀模式、享元模式、組合模式的結(jié)構(gòu)與實(shí)現(xiàn);學(xué)會使用這四種設(shè)計模式開發(fā)應(yīng)用程序;明白這四種設(shè)計模式的擴(kuò)展應(yīng)用。 本章重點(diǎn)內(nèi)容:裝飾模式的特點(diǎn)、結(jié)構(gòu)、應(yīng)用場景與應(yīng)用方法;外觀模式的特點(diǎn)、結(jié)構(gòu)、應(yīng)用場景與應(yīng)用方法;享元模式的特點(diǎn)、結(jié)構(gòu)、應(yīng)用場景與應(yīng)用方法;組合模式的特點(diǎn)、結(jié)構(gòu)、應(yīng)用場景與應(yīng)用方法。軟件設(shè)計模式(Java版)、 作者:程細(xì)柱銷售電話民郵電出版社( 和 )5.1 裝飾(Deco

2、rator)模式 5.1.1 模式的定義與特點(diǎn) 定義:定義:指在指在不改變現(xiàn)有對象結(jié)構(gòu)的情況下不改變現(xiàn)有對象結(jié)構(gòu)的情況下,動態(tài)地,動態(tài)地給該對象增加給該對象增加一些職責(zé)一些職責(zé)(即增加其額外功能)的模式,它屬于(即增加其額外功能)的模式,它屬于對象結(jié)構(gòu)型對象結(jié)構(gòu)型模式模式。 優(yōu)點(diǎn):優(yōu)點(diǎn): 1 1)采用裝飾模式采用裝飾模式擴(kuò)展對象的功能比采用繼承方式更加靈活擴(kuò)展對象的功能比采用繼承方式更加靈活; 2 2)可以設(shè)計出多個不同的具體裝飾類可以設(shè)計出多個不同的具體裝飾類,創(chuàng)造出多個不同行為的,創(chuàng)造出多個不同行為的組合組合。 缺點(diǎn):缺點(diǎn):裝飾模式裝飾模式增加了許多子類增加了許多子類,如果過度使用會使程序

3、,如果過度使用會使程序變得很變得很復(fù)雜復(fù)雜。軟件設(shè)計模式(Java版)、 作者:程細(xì)柱銷售電話民郵電出版社( 和 )5.1 裝飾(Decorator)模式(續(xù)) 5.1.2 模式的結(jié)構(gòu)與實(shí)現(xiàn) 1.1.模式的結(jié)構(gòu)模式的結(jié)構(gòu) 裝飾模式主要包含以下角色:裝飾模式主要包含以下角色: 抽象構(gòu)件(抽象構(gòu)件(ComponentComponent)角色)角色:定義一個抽象接口以規(guī)范準(zhǔn)備:定義一個抽象接口以規(guī)范準(zhǔn)備接收附加責(zé)任的對象。接收附加責(zé)任的對象。 具體構(gòu)件(具體構(gòu)件(Concrete ComponentConcrete Component)角色)角色:實(shí)現(xiàn)抽象構(gòu)件,通過:實(shí)現(xiàn)

4、抽象構(gòu)件,通過裝飾角色為其添加一些職責(zé)。裝飾角色為其添加一些職責(zé)。 抽象裝飾(抽象裝飾(DecoratorDecorator)角色)角色:繼承抽象構(gòu)件,并包含具體構(gòu):繼承抽象構(gòu)件,并包含具體構(gòu)件的實(shí)例,可以通過其子類擴(kuò)展具體構(gòu)件的功能。件的實(shí)例,可以通過其子類擴(kuò)展具體構(gòu)件的功能。 具體裝飾(具體裝飾(Concrete DecoratorConcrete Decorator)角色)角色:實(shí)現(xiàn)抽象裝飾的相關(guān):實(shí)現(xiàn)抽象裝飾的相關(guān)方法,并給具體構(gòu)件對象添加附加的責(zé)任。方法,并給具體構(gòu)件對象添加附加的責(zé)任。軟件設(shè)計模式(Java版)、 作者:程細(xì)柱銷售電話民郵電出版社( 和

5、)5.1 裝飾(Decorator)模式(續(xù)) 5.1.2 模式的結(jié)構(gòu)與實(shí)現(xiàn) 1.1.模式的結(jié)構(gòu)模式的結(jié)構(gòu) 右邊是其結(jié)構(gòu)圖:右邊是其結(jié)構(gòu)圖: 2 2. .模式的實(shí)現(xiàn)模式的實(shí)現(xiàn) /該模式的該模式的實(shí)現(xiàn)實(shí)現(xiàn)代碼見附件代碼見附件軟件設(shè)計模式(Java版)、 作者:程細(xì)柱銷售電話民郵電出版社( 和 )5.1 裝飾(Decorator)模式(續(xù)) 5.1.3 模式的應(yīng)用實(shí)例 【例【例5.15.1】用裝飾模式實(shí)現(xiàn)游戲角】用裝飾模式實(shí)現(xiàn)游戲角色色“莫莉卡莫莉卡安斯蘭安斯蘭”的變身。的變身。 分析:分析:在惡魔戰(zhàn)士中,游戲在惡魔戰(zhàn)士中,游戲角色角色“莫莉卡莫莉卡安斯蘭安斯蘭”的原身

6、是的原身是一個可愛少女,但當(dāng)她變身時,會一個可愛少女,但當(dāng)她變身時,會變成頭頂及背部延伸出蝙蝠狀的飛變成頭頂及背部延伸出蝙蝠狀的飛翼的女妖,當(dāng)然她還可以變?yōu)榇┲淼呐?,?dāng)然她還可以變?yōu)榇┲镣庖碌纳倥_@些都可用裝飾漂亮外衣的少女。這些都可用裝飾模式來實(shí)現(xiàn),右邊是其結(jié)構(gòu)圖:模式來實(shí)現(xiàn),右邊是其結(jié)構(gòu)圖: 注:程序代碼見附件注:程序代碼見附件軟件設(shè)計模式(Java版)、 作者:程細(xì)柱銷售電話民郵電出版社( 和 )5.1 裝飾(Decorator)模式(續(xù)) 5.1.3 模式的應(yīng)用實(shí)例 【例【例5.15.1】用裝飾】用裝飾模式實(shí)現(xiàn)游戲角色模式實(shí)現(xiàn)游戲角色“莫莉卡莫莉卡

7、安斯蘭安斯蘭”的變身。的變身。 右邊是程序的運(yùn)右邊是程序的運(yùn)行結(jié)果行結(jié)果軟件設(shè)計模式(Java版)、 作者:程細(xì)柱銷售電話民郵電出版社( 和 )5.1 裝飾(Decorator)模式(續(xù)) 5.1.4 模式的應(yīng)用場景 裝飾模式通常在以下幾種情況使用:裝飾模式通常在以下幾種情況使用: 1 1)當(dāng))當(dāng)需要給一個現(xiàn)有類添加附加職責(zé)需要給一個現(xiàn)有類添加附加職責(zé),而又,而又不能采用生成子類的不能采用生成子類的方法進(jìn)行擴(kuò)充時方法進(jìn)行擴(kuò)充時。如,該類被隱藏或者該類是終極類或者采用繼承方。如,該類被隱藏或者該類是終極類或者采用繼承方式會產(chǎn)生大量的子類。式會產(chǎn)生大量的子類。 2 2)

8、當(dāng))當(dāng)需要通過對現(xiàn)有的一組基本功能進(jìn)行排列組合而產(chǎn)生非常多需要通過對現(xiàn)有的一組基本功能進(jìn)行排列組合而產(chǎn)生非常多的功能時的功能時,采用,采用繼承關(guān)系很難實(shí)現(xiàn)繼承關(guān)系很難實(shí)現(xiàn),而采用裝飾模式卻很好實(shí)現(xiàn)。,而采用裝飾模式卻很好實(shí)現(xiàn)。 3 3)當(dāng)對象的功能要求)當(dāng)對象的功能要求可以動態(tài)地添加可以動態(tài)地添加,也可以再,也可以再動態(tài)地撤銷動態(tài)地撤銷時。時。軟件設(shè)計模式(Java版)、 作者:程細(xì)柱銷售電話民郵電出版社( 和 )5.1 裝飾(Decorator)模式(續(xù)) 5.1.5 模式的擴(kuò)展 有些應(yīng)用環(huán)境下模式是有些應(yīng)用環(huán)境下模式是可以可以簡化裝飾模式簡化裝飾模式,如在以,如

9、在以下兩種情況:下兩種情況: 如果如果只有一個具體構(gòu)只有一個具體構(gòu)件而沒有抽象構(gòu)件時件而沒有抽象構(gòu)件時,可以,可以讓抽象裝飾繼承具體構(gòu)件,讓抽象裝飾繼承具體構(gòu)件,右邊是其結(jié)構(gòu)圖:右邊是其結(jié)構(gòu)圖:軟件設(shè)計模式(Java版)、 作者:程細(xì)柱銷售電話民郵電出版社( 和 )5.1 裝飾(Decorator)模式(續(xù)) 5.1.5 模式的擴(kuò)展 如果如果只有一個只有一個具體裝飾時具體裝飾時,可以,可以將抽象裝飾和具體將抽象裝飾和具體裝飾合并裝飾合并,右邊是,右邊是其結(jié)構(gòu)圖:其結(jié)構(gòu)圖:軟件設(shè)計模式(Java版)、 作者:程細(xì)柱銷售電話民郵電出版社( 和

10、 )5.2 外觀(Facade)模式 在現(xiàn)實(shí)生活中,常常在現(xiàn)實(shí)生活中,常常存在辦事較復(fù)雜的例子存在辦事較復(fù)雜的例子,如去政府機(jī)關(guān)如去政府機(jī)關(guān)辦房產(chǎn)證辦房產(chǎn)證或或注冊一家公司注冊一家公司,有時要同,有時要同多個部門聯(lián)系,這時要是多個部門聯(lián)系,這時要是有一個綜合部門能解決一有一個綜合部門能解決一切手續(xù)問題就好了切手續(xù)問題就好了,右圖,右圖給出了客戶去當(dāng)?shù)胤慨a(chǎn)交給出了客戶去當(dāng)?shù)胤慨a(chǎn)交易中心辦理房產(chǎn)證過戶要易中心辦理房產(chǎn)證過戶要遇到的業(yè)務(wù)處理部門:遇到的業(yè)務(wù)處理部門:軟件設(shè)計模式(Java版)、 作者:程細(xì)柱銷售電話民郵電出版社( 和 )5.2 外觀(Facade)模式(續(xù)

11、) 5.2.1 模式的定義與特點(diǎn) 定義:定義:是一種通過是一種通過為多個復(fù)雜的子系統(tǒng)提供一個一致的接口為多個復(fù)雜的子系統(tǒng)提供一個一致的接口,而使這些子系,而使這些子系統(tǒng)更加容易被訪問的模式。統(tǒng)更加容易被訪問的模式。 優(yōu)點(diǎn):優(yōu)點(diǎn):1 1)降低了降低了子系統(tǒng)與客戶端之間的子系統(tǒng)與客戶端之間的耦合度耦合度,使得子系統(tǒng)的變化不會影,使得子系統(tǒng)的變化不會影響到調(diào)用它的客戶類響到調(diào)用它的客戶類;2 2)對客戶屏蔽了子系統(tǒng)組件對客戶屏蔽了子系統(tǒng)組件,減少了客戶處理的對象數(shù),減少了客戶處理的對象數(shù)目,并使得子系統(tǒng)使用起來更加容易;目,并使得子系統(tǒng)使用起來更加容易;3 3)降低了大型軟件系統(tǒng)中的編譯依賴性降低了

12、大型軟件系統(tǒng)中的編譯依賴性,簡化了系統(tǒng)在不同平臺之間的移植過程,因?yàn)榫幾g一個子系統(tǒng)不會影響其他的子簡化了系統(tǒng)在不同平臺之間的移植過程,因?yàn)榫幾g一個子系統(tǒng)不會影響其他的子系統(tǒng),也不會影響到外觀對象系統(tǒng),也不會影響到外觀對象。 缺點(diǎn):缺點(diǎn):1 1)不能很好地限制客戶使用子系統(tǒng)類不能很好地限制客戶使用子系統(tǒng)類;2 2)增加新的子系統(tǒng)可能需要增加新的子系統(tǒng)可能需要修改外觀類或客戶端的源代碼修改外觀類或客戶端的源代碼,違背了,違背了“開閉原則開閉原則”。軟件設(shè)計模式(Java版)、 作者:程細(xì)柱銷售電話民郵電出版社( 和 )5.2 外觀(Facade)模式(續(xù)) 5.2.2

13、模式的結(jié)構(gòu)與實(shí)現(xiàn) 1.1.模式的結(jié)構(gòu)模式的結(jié)構(gòu) 外觀模式的結(jié)構(gòu)比較簡單,主要包含以下主要角色:外觀模式的結(jié)構(gòu)比較簡單,主要包含以下主要角色: 外觀(外觀(FacadeFacade)角色)角色:為多個子系統(tǒng)對外提供一個共同的接:為多個子系統(tǒng)對外提供一個共同的接口??凇?子系統(tǒng)(子系統(tǒng)(SubSystemSubSystem)角色)角色:實(shí)現(xiàn)系統(tǒng)的部分功能,客戶可以:實(shí)現(xiàn)系統(tǒng)的部分功能,客戶可以通過外觀角色訪問它。通過外觀角色訪問它。 客戶(客戶(clientclient)角色)角色:通過一個外觀角色訪問各個子系統(tǒng)的:通過一個外觀角色訪問各個子系統(tǒng)的功能。功能。軟件設(shè)計模式(Java版)、 作者:程

14、細(xì)柱銷售電話民郵電出版社( 和 )5.2 外觀(Facade)模式(續(xù)) 5.2.2 模式的結(jié)構(gòu)與實(shí)現(xiàn) 1.1.模式的結(jié)構(gòu)模式的結(jié)構(gòu) 右邊是其結(jié)構(gòu)圖:右邊是其結(jié)構(gòu)圖: 2 2. .模式的實(shí)現(xiàn)模式的實(shí)現(xiàn) /該模式的該模式的實(shí)現(xiàn)實(shí)現(xiàn)代碼見附件代碼見附件軟件設(shè)計模式(Java版)、 作者:程細(xì)柱銷售電話民郵電出版社( 和 )5.2 外觀(Facade)模式(續(xù)) 5.2.3 模式的應(yīng)用實(shí)例 【例【例5.25.2】 用用“外觀模式外觀模式”設(shè)設(shè)計一個婺源特產(chǎn)的選購界面。計一個婺源特產(chǎn)的選購界面。 分析:分析:本實(shí)例的外觀角色本實(shí)例的外觀角色WyS

15、pecialtyWySpecialty擁有擁有8 8個子系統(tǒng)角色個子系統(tǒng)角色Specialty1 . Specialty8Specialty1 . Specialty8,每個子系統(tǒng)管理一種婺源特產(chǎn),每個子系統(tǒng)管理一種婺源特產(chǎn),右邊是其結(jié)構(gòu)圖:右邊是其結(jié)構(gòu)圖: 注:程序代碼見附件注:程序代碼見附件軟件設(shè)計模式(Java版)、 作者:程細(xì)柱銷售電話民郵電出版社( 和 )5.2 外觀(Facade)模式(續(xù)) 5.2.3 模式的應(yīng)用實(shí)例 【例【例5.25.2】 用用“外觀模式外觀模式”設(shè)計設(shè)計一個婺源特產(chǎn)的選一個婺源特產(chǎn)的選購界面。購界面。 右邊是程序的右邊是程序的運(yùn)行結(jié)

16、果運(yùn)行結(jié)果軟件設(shè)計模式(Java版)、 作者:程細(xì)柱銷售電話民郵電出版社( 和 )5.2 外觀(Facade)模式(續(xù)) 5.2.4 模式的應(yīng)用場景 通常在以下情況下可以考慮使用外觀模式:通常在以下情況下可以考慮使用外觀模式: 1 1)對分層結(jié)構(gòu)系統(tǒng)構(gòu)建時對分層結(jié)構(gòu)系統(tǒng)構(gòu)建時,使用外觀模式定義子系統(tǒng)中每層的入,使用外觀模式定義子系統(tǒng)中每層的入口點(diǎn)可以簡化子系統(tǒng)之間的依賴關(guān)系??邳c(diǎn)可以簡化子系統(tǒng)之間的依賴關(guān)系。 2 2)對于一個復(fù)雜系統(tǒng),)對于一個復(fù)雜系統(tǒng),其子系統(tǒng)很多其子系統(tǒng)很多,外觀模式可以為系統(tǒng)設(shè)計,外觀模式可以為系統(tǒng)設(shè)計一個簡單的接口供外界訪問。一個簡單的接口

17、供外界訪問。 3 3)當(dāng)客戶端與多個子系統(tǒng)之間存在很大的聯(lián)系時當(dāng)客戶端與多個子系統(tǒng)之間存在很大的聯(lián)系時,引入外觀模式,引入外觀模式可將它們分離,從而提高子系統(tǒng)的獨(dú)立性和可移植性??蓪⑺鼈兎蛛x,從而提高子系統(tǒng)的獨(dú)立性和可移植性。軟件設(shè)計模式(Java版)、 作者:程細(xì)柱銷售電話民郵電出版社( 和 )5.2 外觀(Facade)模式(續(xù)) 5.2.5 模式的擴(kuò)展 在外觀模式中在外觀模式中,當(dāng)增,當(dāng)增加或移除子系統(tǒng)時需要修加或移除子系統(tǒng)時需要修改外觀類改外觀類,這,這違背了違背了“開開閉原則閉原則”。如果。如果引入抽象引入抽象外觀類外觀類,則在一定程度上,則在一定程度上解

18、決了該問題,右邊其結(jié)解決了該問題,右邊其結(jié)構(gòu)圖:構(gòu)圖:軟件設(shè)計模式(Java版)、 作者:程細(xì)柱銷售電話民郵電出版社( 和 )5.3 享元(Flyweight)模式 在面向?qū)ο蟪绦蛟O(shè)計過程中,在面向?qū)ο蟪绦蛟O(shè)計過程中,有時會面臨要創(chuàng)建大量相同或相似有時會面臨要創(chuàng)建大量相同或相似對象實(shí)例的問題對象實(shí)例的問題。創(chuàng)建那么多的對象將會耗費(fèi)很多的系統(tǒng)資源,它是。創(chuàng)建那么多的對象將會耗費(fèi)很多的系統(tǒng)資源,它是系統(tǒng)性能提高的一個瓶頸。如:圍棋和五子棋中的系統(tǒng)性能提高的一個瓶頸。如:圍棋和五子棋中的黑白棋子黑白棋子,圖像中,圖像中的的坐標(biāo)點(diǎn)坐標(biāo)點(diǎn)或或顏色顏色,局域網(wǎng)中的,局域網(wǎng)中的路

19、由器、交換機(jī)和集線器路由器、交換機(jī)和集線器,教室里的,教室里的桌桌子和凳子子和凳子等等。這些對象有很多相似的地方,如果能把它們相同的部等等。這些對象有很多相似的地方,如果能把它們相同的部分提取出來分提取出來共享共享,則能節(jié)省大量的系統(tǒng)資源,這就是享元模式的產(chǎn)生,則能節(jié)省大量的系統(tǒng)資源,這就是享元模式的產(chǎn)生的背景。的背景。軟件設(shè)計模式(Java版)、 作者:程細(xì)柱銷售電話民郵電出版社( 和 )5.3 享元(Flyweight)模式(續(xù)) 5.3.1 模式的定義與特點(diǎn) 定義:定義:運(yùn)用共享技術(shù)來有效地支持大量細(xì)粒度對象的復(fù)用運(yùn)用共享技術(shù)來有效地支持大量細(xì)粒度對象的復(fù)用。

20、它通。它通過共享已經(jīng)存在的對象來提高系統(tǒng)資源的利用率。過共享已經(jīng)存在的對象來提高系統(tǒng)資源的利用率。 優(yōu)點(diǎn):優(yōu)點(diǎn):相同對象只要保存一份,這相同對象只要保存一份,這降低了系統(tǒng)中對象的數(shù)量降低了系統(tǒng)中對象的數(shù)量,從,從而降低了系統(tǒng)中細(xì)粒度對象給內(nèi)存帶來的壓力而降低了系統(tǒng)中細(xì)粒度對象給內(nèi)存帶來的壓力。 缺點(diǎn):缺點(diǎn):1 1)為了使對象可以共享,)為了使對象可以共享,需要將一些不能共享的狀態(tài)外需要將一些不能共享的狀態(tài)外部化部化,這將,這將增加程序的復(fù)雜性增加程序的復(fù)雜性; 2 2)讀取享元模式的外部狀態(tài)會使得運(yùn)行時間稍微變長讀取享元模式的外部狀態(tài)會使得運(yùn)行時間稍微變長。軟件設(shè)計模式(Java版)、 作者:

21、程細(xì)柱銷售電話民郵電出版社( 和 )5.3 享元(Flyweight)模式(續(xù)) 5.3.2 模式的結(jié)構(gòu)與實(shí)現(xiàn) 享元模式中存在以下享元模式中存在以下2 2種狀態(tài):種狀態(tài): 1 1)內(nèi)部狀態(tài)內(nèi)部狀態(tài):即即不會隨著環(huán)境的改變而改變的不會隨著環(huán)境的改變而改變的可共享部分可共享部分; 2 2)外部狀態(tài)外部狀態(tài):指:指隨環(huán)境改變而改變的隨環(huán)境改變而改變的不可以共享的部分不可以共享的部分。 享元模式的實(shí)現(xiàn)要領(lǐng)就是區(qū)分應(yīng)用中的這享元模式的實(shí)現(xiàn)要領(lǐng)就是區(qū)分應(yīng)用中的這2 2種狀態(tài),并將外部狀種狀態(tài),并將外部狀態(tài)外部化。下面我們來分析其基本結(jié)構(gòu)和實(shí)現(xiàn)方法。態(tài)外部化。下面我們來分析其基本

22、結(jié)構(gòu)和實(shí)現(xiàn)方法。軟件設(shè)計模式(Java版)(ISDN:9787564740634)、 作者:程細(xì)柱人民郵電出版社()銷售電話:010-810552565.3 享元(Flyweight)模式(續(xù)) 5.3.2 模式的結(jié)構(gòu)與實(shí)現(xiàn)(續(xù)) 1.1.模式的結(jié)構(gòu)模式的結(jié)構(gòu) 享元模式的主要角色有:享元模式的主要角色有: 抽象享元(抽象享元(FlyweightFlyweight)角色)角色:是所有的具體享元類的基類,:是所有的具體享元類的基類,為具體享元規(guī)范需要實(shí)現(xiàn)的公共接口,非享元的外部狀態(tài)以參數(shù)的形為具體享元規(guī)范需要實(shí)現(xiàn)的公共接口,非享元的外部狀態(tài)以參數(shù)的形式通過方法傳入。式通過方法傳入。 具體享元具體享

23、元(ConcreteFlyweight)(ConcreteFlyweight)角色角色:實(shí)現(xiàn)抽象享元角色中所:實(shí)現(xiàn)抽象享元角色中所規(guī)定的接口。規(guī)定的接口。 非享元非享元(UnsharableFlyweight)(UnsharableFlyweight)角色角色:是不可以共享的外部狀:是不可以共享的外部狀態(tài),它以參數(shù)的形式注入到具體享元的相關(guān)方法中。態(tài),它以參數(shù)的形式注入到具體享元的相關(guān)方法中。 (4) (4)享元工廠享元工廠(FlyweightFactoiy)(FlyweightFactoiy)角色角色:負(fù)責(zé)創(chuàng)建和管理享元角色。:負(fù)責(zé)創(chuàng)建和管理享元角色。軟件設(shè)計模式(Java版)、 作者:程細(xì)

24、柱銷售電話民郵電出版社( 和 )5.3 享元(Flyweight)模式(續(xù)) 5.3.2 模式的結(jié)構(gòu)與實(shí)現(xiàn)(續(xù)) 1.1.模式的結(jié)構(gòu)模式的結(jié)構(gòu) 右邊是其結(jié)構(gòu)圖:右邊是其結(jié)構(gòu)圖: 2 2. .模式的實(shí)現(xiàn)模式的實(shí)現(xiàn) /該模式的該模式的實(shí)現(xiàn)代實(shí)現(xiàn)代碼見附件碼見附件軟件設(shè)計模式(Java版)、 作者:程細(xì)柱銷售電話民郵電出版社( 和 )5.3 享元(Flyweight)模式(續(xù)) 5.3.3 模式的應(yīng)用實(shí)例 【例【例5.35.3】 享元模式在享元模式在五子棋游戲中的應(yīng)用。五子棋游戲中的應(yīng)用。 分析:分析:五子棋同圍棋五子棋同圍棋一樣,包含多個一樣

25、,包含多個“黑黑”或或“白白”顏色的棋子,所以顏色的棋子,所以用享元模式比較好,右邊用享元模式比較好,右邊是其結(jié)構(gòu)圖:是其結(jié)構(gòu)圖: 注:程序代碼見附件注:程序代碼見附件軟件設(shè)計模式(Java版)、 作者:程細(xì)柱銷售電話民郵電出版社( 和 )5.3 享元(Flyweight)模式(續(xù)) 5.3.3 模式的應(yīng)用實(shí)例 【例【例5.35.3】 享元享元模式在五子棋游戲模式在五子棋游戲中的應(yīng)用。中的應(yīng)用。 右邊是程序的運(yùn)右邊是程序的運(yùn)行結(jié)果行結(jié)果軟件設(shè)計模式(Java版)、 作者:程細(xì)柱銷售電話民郵電出版社( 和 )5.3 享元(Flyweight

26、)模式(續(xù)) 5.3.4 模式的應(yīng)用場景 在以下幾種情形適合采用享元模式:在以下幾種情形適合采用享元模式: 1 1)系統(tǒng)中)系統(tǒng)中存在大量相同或相似的對象存在大量相同或相似的對象,這些對象耗費(fèi)大量的內(nèi)存,這些對象耗費(fèi)大量的內(nèi)存資源。資源。 2 2)大部分的對象可以按照內(nèi)部狀態(tài)進(jìn)行分成組大部分的對象可以按照內(nèi)部狀態(tài)進(jìn)行分成組,且可將不同部分,且可將不同部分外部化,這樣每一個組只需保存一個內(nèi)部狀態(tài)。外部化,這樣每一個組只需保存一個內(nèi)部狀態(tài)。 3 3)由于享元模式需要額外維護(hù)一個保存享元的數(shù)據(jù)結(jié)構(gòu),所以應(yīng))由于享元模式需要額外維護(hù)一個保存享元的數(shù)據(jù)結(jié)構(gòu),所以應(yīng)當(dāng)當(dāng)在在有足夠多的享元實(shí)例有足夠多的享元

27、實(shí)例時才值得使用享元模式。時才值得使用享元模式。軟件設(shè)計模式(Java版)、 作者:程細(xì)柱銷售電話民郵電出版社( 和 )5.3 享元(Flyweight)模式(續(xù)) 5.3.5 模式的擴(kuò)展 存在兩種特殊的享存在兩種特殊的享元模式:元模式:1 1)單純享元單純享元模式模式,這種享元模式中,這種享元模式中的所有的具體享元類都的所有的具體享元類都是可以共享的,不存在是可以共享的,不存在非共享的具體享元類,非共享的具體享元類,右邊是其結(jié)構(gòu)圖:右邊是其結(jié)構(gòu)圖:軟件設(shè)計模式(Java版)、 作者:程細(xì)柱銷售電話民郵電出版社( 和 )5.3 享元(Fl

28、yweight)模式(續(xù)) 5.3.5 模式的擴(kuò)展 2 2)復(fù)合享元模式復(fù)合享元模式,這種,這種享元模式中的有些享元對象享元模式中的有些享元對象是由一些單純享元對象組合是由一些單純享元對象組合而成的,它們就是復(fù)合享元而成的,它們就是復(fù)合享元對象。雖然復(fù)合享元對象本對象。雖然復(fù)合享元對象本身不能共享,但它們可以分身不能共享,但它們可以分解成單純享元對象再被共享,解成單純享元對象再被共享,右邊是其結(jié)構(gòu)圖:右邊是其結(jié)構(gòu)圖:軟件設(shè)計模式(Java版)、 作者:程細(xì)柱銷售電話民郵電出版社( 和 )5.4 組合(Composite)模式 5.4.1 模式的定義與特點(diǎn) 定義:定義

29、:有時又叫做有時又叫做部分部分- -整體模式整體模式,它是一種,它是一種將對象組合成樹狀將對象組合成樹狀的層次結(jié)構(gòu)的模式的層次結(jié)構(gòu)的模式,用來表示,用來表示“部分部分- -整體整體”的關(guān)系,使用戶對單個的關(guān)系,使用戶對單個對象和組合對象具有一致的訪問性對象和組合對象具有一致的訪問性。 優(yōu)點(diǎn):優(yōu)點(diǎn): 1 1)組合模式使得組合模式使得客戶端代碼可以一致地處理單個對象和組合對客戶端代碼可以一致地處理單個對象和組合對象象,無需關(guān)心自己處理的是單個對象,還是組合對象,這簡化了客戶,無需關(guān)心自己處理的是單個對象,還是組合對象,這簡化了客戶端代碼;端代碼; 2 2)更容易在組合體內(nèi)加入新的對象更容易在組合體

30、內(nèi)加入新的對象,客戶端不會因?yàn)榧尤肓诵?,客戶端不會因?yàn)榧尤肓诵碌膶ο蠖脑创a,滿足的對象而更改源代碼,滿足“開閉原則開閉原則”。 缺點(diǎn):缺點(diǎn):1 1)設(shè)計較復(fù)雜設(shè)計較復(fù)雜,客戶端需要花更多時間理清類之間的層,客戶端需要花更多時間理清類之間的層次關(guān)系;次關(guān)系;2 2)不容易限制容器中的構(gòu)件不容易限制容器中的構(gòu)件;3 3)不容易用繼承的方法來增不容易用繼承的方法來增加構(gòu)件的新功能加構(gòu)件的新功能。軟件設(shè)計模式(Java版)、 作者:程細(xì)柱銷售電話民郵電出版社( 和 )5.4 組合(Composite)模式(續(xù)) 5.4.2 模式的結(jié)構(gòu)與實(shí)現(xiàn) 1.1.模式的結(jié)構(gòu)模式的結(jié)

31、構(gòu) 組合模式包含以下主要角色:組合模式包含以下主要角色: 抽象構(gòu)件(抽象構(gòu)件(ComponentComponent)角色)角色:它的主要作用是:它的主要作用是為樹葉構(gòu)件和樹枝構(gòu)件聲為樹葉構(gòu)件和樹枝構(gòu)件聲明公共接口明公共接口,并實(shí)現(xiàn)它們的缺省行為。在,并實(shí)現(xiàn)它們的缺省行為。在透明式的組合模式透明式的組合模式中抽象構(gòu)件還聲明訪中抽象構(gòu)件還聲明訪問和管理子類的接口;在問和管理子類的接口;在安全式的組合模式安全式的組合模式中不聲明訪問和管理子類的接口,管中不聲明訪問和管理子類的接口,管理工作由樹枝構(gòu)件完成。理工作由樹枝構(gòu)件完成。 樹葉構(gòu)件(樹葉構(gòu)件(LeafLeaf)角色)角色:是組合中的葉節(jié)點(diǎn)對象,

32、它:是組合中的葉節(jié)點(diǎn)對象,它沒有子節(jié)點(diǎn)沒有子節(jié)點(diǎn),用于實(shí),用于實(shí)現(xiàn)抽象構(gòu)件角色中聲明的公共接口?,F(xiàn)抽象構(gòu)件角色中聲明的公共接口。 樹枝構(gòu)件(樹枝構(gòu)件(CompositeComposite)角色)角色:是組合中的分支節(jié)點(diǎn)對象,它:是組合中的分支節(jié)點(diǎn)對象,它有子節(jié)點(diǎn)有子節(jié)點(diǎn)。它實(shí)現(xiàn)了抽象構(gòu)件角色中聲明的接口,它的它實(shí)現(xiàn)了抽象構(gòu)件角色中聲明的接口,它的主要作用是存儲和管理子部件主要作用是存儲和管理子部件,通常,通常包含包含AddAdd()、()、RemoveRemove()、()、GetChild()GetChild()等方法。等方法。軟件設(shè)計模式(Java版)、 作者:程細(xì)柱銷售電話:010-81

33、055256人民郵電出版社( 和 )5.4 組合(Composite)模式(續(xù)) 5.4.2 模式的結(jié)構(gòu)與實(shí)現(xiàn)(續(xù)) 組合模式分為組合模式分為透明式的組合模透明式的組合模式和式和安全式的組合安全式的組合模式:模式: 1.1.透明式的組合模式的結(jié)構(gòu)透明式的組合模式的結(jié)構(gòu) 在該方式中,由于在該方式中,由于抽象構(gòu)件聲明了抽象構(gòu)件聲明了所有子類中的全部方法所有子類中的全部方法,所以客戶端無,所以客戶端無需區(qū)別樹葉對象和樹枝對象,對于客戶需區(qū)別樹葉對象和樹枝對象,對于客戶端來說是端來說是透明的透明的,右邊是其結(jié)構(gòu)圖:,右邊是其結(jié)構(gòu)圖: /該模式的該模式的實(shí)現(xiàn)代碼見附件實(shí)現(xiàn)代碼見附件軟件設(shè)計模式(Java

34、版)、 作者:程細(xì)柱銷售電話民郵電出版社( 和 )5.4 組合(Composite)模式(續(xù)) 5.4.2 模式的結(jié)構(gòu)與實(shí)現(xiàn)(續(xù)) 組合模式分為組合模式分為透明式的組合模透明式的組合模式和式和安全式的組合安全式的組合模式:模式: 2 2. .安全式的組合模式的結(jié)構(gòu)安全式的組合模式的結(jié)構(gòu) 在該方式中,在該方式中,將管理子構(gòu)件的方法將管理子構(gòu)件的方法移到樹枝構(gòu)件中移到樹枝構(gòu)件中,抽象構(gòu)件和樹葉構(gòu)件,抽象構(gòu)件和樹葉構(gòu)件沒有對子對象的管理方法,客戶端在調(diào)沒有對子對象的管理方法,客戶端在調(diào)用時要知道樹葉對象和樹枝對象的存在,用時要知道樹葉對象和樹枝對象的存在,所以所以失去了透

35、明性失去了透明性,右邊是其結(jié)構(gòu)圖:,右邊是其結(jié)構(gòu)圖: /該模式的該模式的實(shí)現(xiàn)方式見后面的實(shí)例實(shí)現(xiàn)方式見后面的實(shí)例軟件設(shè)計模式(Java版)、 作者:程細(xì)柱銷售電話民郵電出版社( 和 )5.4 組合(Composite)模式(續(xù)) 5.4.3 模式的應(yīng)用實(shí)例 【例【例5.45.4】用組合模式實(shí)現(xiàn)當(dāng)用戶在商店購物后,顯示其所選商品信息,并計算所】用組合模式實(shí)現(xiàn)當(dāng)用戶在商店購物后,顯示其所選商品信息,并計算所選商品總價的功能。選商品總價的功能。 分析:分析:假如李先生用假如李先生用1 1個紅色小袋子裝了個紅色小袋子裝了2 2包婺源特產(chǎn)包婺源特產(chǎn)( (單價單價7.97.9元元) )、1 1張婺源地圖張婺源地圖( (單價單價9.99.9元元) );用;用1 1個白色小袋子裝了個白色小袋子裝了2 2包韶關(guān)香菇包韶關(guān)香菇( (單價單價6868元元) )和和3 3包韶關(guān)紅茶包韶關(guān)紅茶( (單價單價180180元元) );用;用1 1個中袋子裝了前面的紅色小袋子和個中袋子裝了前面的紅色小袋子和1 1個景德鎮(zhèn)瓷器個景德鎮(zhèn)瓷器( (單價單價380380元元) );用;用1 1個個大袋子裝了前面的中袋子、白色小袋子和大袋子裝了前面的中袋子、白色小袋子和1 1雙李寧牌運(yùn)動鞋雙李寧牌運(yùn)動鞋( (單價單價198198元元)

溫馨提示

  • 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

提交評論