日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java中设计模式之装饰者模式-2

發(fā)布時間:2025/3/20 java 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java中设计模式之装饰者模式-2 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

裝飾者模式:

動態(tài)地將責任附加到對象上。若要擴展功能,裝飾者提供了比繼承更加有彈性的替代方案。
裝飾者核心:實現(xiàn)功能組合

繼承與組合區(qū)別:

繼承
繼承是給一個類添加行為的比較有效的途徑。通過使用繼承,可以使得子類在擁有自身方法的同時,還可以擁有父類的方法。但是使用繼承是靜態(tài)的,在編譯的時候就已經(jīng)決定了子類的行為,我們不便于控制增加行為的方式和時機。

組合
組合即將一個對象嵌入到另一個對象中,由另一個對象來決定是否引用該對象來擴展自己的行為。這是一種動態(tài)的方式,我們可以在應(yīng)用程序中動態(tài)的控制。

與繼承相比,組合關(guān)系的優(yōu)勢就在于不會破壞類的封裝性,且具有較好的松耦合性,可以使系統(tǒng)更加容易維護。但是它的缺點就在于要創(chuàng)建比繼承更多的對象。

裝飾者模式優(yōu)點

一句話:在原有的基礎(chǔ)上 ,增加功能 ,提高效率

1、裝飾者模式可以提供比繼承更多的靈活性

2、可以通過一種動態(tài)的方式來擴展一個對象的功能,在運行時選擇不同的裝飾器,從而實現(xiàn)不同的行為。

3、通過使用不同的具體裝飾類以及這些裝飾類的排列組合,可以創(chuàng)造出很多不同行為的組合。可以使用多個具體裝飾類來裝飾同一對象,得到功能更為強大的對象。

4、具體構(gòu)件類與具體裝飾類可以獨立變化,用戶可以根據(jù)需要增加新的具體構(gòu)件類和具體裝飾類,在使用時再對其進行組合,原有代碼無須改變,符合“開閉原則”。

裝飾者模式缺點

一句話:繁瑣

1、會產(chǎn)生很多的小對象,增加了系統(tǒng)的復(fù)雜性

2、這種比繼承更加靈活機動的特性,也同時意味著裝飾模式比繼承更加易于出錯,排錯也很困難,對于多次裝飾的對象,調(diào)試時尋找錯誤可能需要逐級排查,較為煩瑣。

裝飾者應(yīng)用場景

1、在不影響其他對象的情況下,以動態(tài)、透明的方式給單個對象添加職責。

2、需要動態(tài)地給一個對象增加功能,這些功能也可以動態(tài)地被撤銷。 當不能采用繼承的方式對系統(tǒng)進行擴充或者采用繼承不利于系統(tǒng)擴展和維護時。

個人理解:
裝飾者模式是指在繼承父類后,重寫父類方法時,不改變父類中該方法的原有功能,只是在該功能基礎(chǔ)上添加自己想要擴充的功能。

一句話:父類原有功能不變,子類再添加其他功能

簡單實例:

父類

package 設(shè)計模式之裝飾者模式;public class Father {public void run(){System.out.println("跑步...");} }

子類:
在子類中重寫run方法時,不改變父類的原有功能,并根據(jù)需要添加自己的功能。這里的裝飾并不復(fù)雜,不存在多層裝飾,所以在子類中創(chuàng)建一個父類屬性是多余的,但在多層裝飾中,這是必要的。

package 設(shè)計模式之裝飾者模式;public class Son extends Father {Father father;public Son(Father father) {super();this.father = father;}@Overridepublic void run() {System.out.println("欣賞周圍的美景...");father.run();System.out.println("聽歌...");} }

測試類:

package 設(shè)計模式之裝飾者模式;public class Test {public static void main(String[] args){Father father=new Father();father.run();System.out.println("son:");Son son = new Son(father);son.run();} }

結(jié)果:

多層裝飾實例

借鑒實例,來自http://www.cnblogs.com/xinye/p/3910149.html
邏輯分析圖:

1.裝飾者基類(被操作的對象)

package com.xinye.test.decoration; /*** 食物基類* @author xinye**/ public abstract class Food {protected String desc;public abstract String getDesc(); }

2.被操作對象具體類

雞肉

package com.xinye.test.decoration; /*** 雞肉* @author xinye**/ public class Chicken extends Food {public Chicken(){desc = "雞肉";}@Overridepublic String getDesc() {return desc;}}

鴨肉

package com.xinye.test.decoration; /*** 鴨肉* @author xinye**/ public class Duck extends Food {public Duck(){desc = "鴨肉";}@Overridepublic String getDesc() {return desc;}}

3.裝飾者基類(操作類,對對象實現(xiàn)什么操作)

package com.xinye.test.decoration; /*** * @author xinye**/ public abstract class FoodDecoration extends Food {@Overridepublic abstract String getDesc();}

4.具體操作類

蒸-裝飾者

package com.xinye.test.decoration; /*** 蒸食物* @author xinye**/ public class SteamedFood extends FoodDecoration {private Food food;public SteamedFood(Food f){this.food = f;}@Overridepublic String getDesc() {return getDecoration() + food.getDesc();}private String getDecoration(){return "蒸";} }

烤-裝飾者

package com.xinye.test.decoration; /*** 烤食物* @author xinye**/ public class RoastFood extends FoodDecoration {private Food food;public RoastFood(Food f){this.food = f;}@Overridepublic String getDesc() {return getDecoration() + food.getDesc();}private String getDecoration(){return "烤";} }

5.測試類(客戶端)

package com.xinye.test.decoration; /*** 客戶端* @author xinye**/ public class Client {public static void main(String[] args) {// 測試單純的食物Food f1 = new Chicken();System.out.println(f1.getDesc());System.out.println("----------------------");// 測試單重修飾的食物RoastFood rf = new RoastFood(f1);System.out.println(rf.getDesc());System.out.println("----------------------");// 測試多重修飾的食物SteamedFood sf = new SteamedFood(rf);System.out.println(sf.getDesc());} }

執(zhí)行結(jié)果:

雞肉
烤雞肉
蒸烤雞肉

總結(jié)

以上是生活随笔為你收集整理的Java中设计模式之装饰者模式-2的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。