資源描述:
《設(shè)計(jì)模式 - 裝飾者模式》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、設(shè)計(jì)模式讀書筆記-----裝飾者模式我們都知道,可以使用兩種方式給一個(gè)類或者對象添加行為。一是使用繼承。繼承是給一個(gè)類添加行為的比較有效的途徑。通過使用繼承,可以使得子類在擁有自身方法的同時(shí),還可以擁有父類的方法。但是使用繼承是靜態(tài)的,在編譯的時(shí)候就已經(jīng)決定了子類的行為,我們不便于控制增加行為的方式和時(shí)機(jī)。二是使用關(guān)聯(lián)。組合即將一個(gè)對象嵌入到另一個(gè)對象中,由另一個(gè)對象來決定是否引用該對象來擴(kuò)展自己的行為。這是一種動態(tài)的方式,我們可以在應(yīng)用程序中動態(tài)的控制。與繼承相比,關(guān)聯(lián)關(guān)系的優(yōu)勢就在于不會破壞類的封裝性,且具有較好的松耦合性,可以使系統(tǒng)更加
2、容易維護(hù)。但是它的缺點(diǎn)就在于要創(chuàng)建比繼承更多的對象。一、基本定義裝飾者模式,動態(tài)地將責(zé)任附加到對象上。若要擴(kuò)展功能,裝飾者提供了比繼承更加有彈性的替代方案。二、模式結(jié)構(gòu)裝飾者模式UML結(jié)構(gòu)圖。Component:抽象構(gòu)件。是定義一個(gè)對象接口,可以給這些對象動態(tài)地添加職責(zé)。ConcreteComponent:具體構(gòu)件。是定義了一個(gè)具體的對象,也可以給這個(gè)對象添加一些職責(zé)。Decorator:抽象裝飾類。是裝飾抽象類,繼承了Component,從外類來擴(kuò)展Component類的功能,但對于Component來說,是無需知道Decorator存在的
3、。ConcreteDecorator:具體裝飾類,起到給Component添加職責(zé)的功能。三、實(shí)現(xiàn)裝飾者模式情景模式:星巴茲以擴(kuò)張速度快而聞名。在里面購買咖啡時(shí),可以要求在其中加入各種調(diào)料,星巴茲會根據(jù)所加入的調(diào)料收取不同的費(fèi)用,也就是說不同的咖啡與調(diào)料之間有N多不同的組合方式。每種咖啡和調(diào)料都有不同的收費(fèi)。如果這個(gè)時(shí)候我們使用繼承方式,則會陷入無以復(fù)加的地步。這里會有N多個(gè)類,出現(xiàn)“類爆炸”現(xiàn)象。結(jié)構(gòu)圖如下:裝飾者模式提供了一個(gè)比較好的解決方案。編碼實(shí)現(xiàn):ComponentBeverage.java1publicabstractclassB
4、everage{2protectedStringdescription="UnknownBeverage";34publicStringgetDescription(){5returndescription;6}78publicabstractdoublecost();9}四個(gè)組件:HouseBlend.java1publicclassHouseBlendextendsBeverage{23publicHouseBlend(){4description="HouseBlend";5}67@Override8publicdoublecost()
5、{9return0.89;10}1112}DarkRoast.java1publicclassDarkRoastextendsBeverage{2publicDarkRoast(){3description="DarkRoast";4}5@Override6publicdoublecost(){7return1.05;8}910}Espresso.java1publicclassDarkRoastextendsBeverage{2publicDarkRoast(){3description="DarkRoast";4}5@Override6p
6、ublicdoublecost(){7return1.05;8}910}Decat.java1publicclassDecatextendsBeverage{2publicDecat(){3description="Decat";4}56@Override7publicdoublecost(){8return0.99;9}1011}CondimentDecorator.java1publicabstractclassCondimentDecoratorextendsBeverage{2publicabstractStringgetDescri
7、ption();3}Milk.java1publicclassMilkextendsCondimentDecorator{2Beveragebeverage;34publicMilk(Beveragebeverage){5this.beverage=beverage;6}78@Override9publicStringgetDescription(){10returnbeverage.getDescription()+",Milk";11}1213@Override14publicdoublecost(){15returnbeverage.c
8、ost()+0.3;16}17}Mocha.java1publicclassMochaextendsCondimentDecorator{2Beveragebeve