濟(jì)南做網(wǎng)站優(yōu)化公司百度超級(jí)鏈
裝飾模式詳細(xì)講解
- 一、定義
- 二、裝飾模式結(jié)構(gòu)
- 核心思想
- 模式角色
- 模式的UML類圖
- 應(yīng)用場(chǎng)景
- 模式優(yōu)點(diǎn)
- 模式缺點(diǎn)
- 實(shí)例演示
- 圖示
- 代碼演示
- 運(yùn)行結(jié)果
一、定義
裝飾模式(別名:包裝器)
裝飾模式(Decorator Pattern)是結(jié)構(gòu)型的設(shè)計(jì)模式,它允許在運(yùn)行時(shí)動(dòng)態(tài)地向?qū)ο筇砑?strong>新的職責(zé)或功能,同時(shí)保持對(duì)象的原始類不變。通過使用裝飾器模式,可以在不修改現(xiàn)有代碼的基礎(chǔ)上擴(kuò)展對(duì)象的功能,
二、裝飾模式結(jié)構(gòu)
核心思想
1.動(dòng)態(tài)擴(kuò)展:在不改變?cè)惤Y(jié)構(gòu)和繼承關(guān)系的情況下,動(dòng)態(tài)地為對(duì)象添加功能。
2.包裝對(duì)象:通過創(chuàng)建一個(gè)包裝對(duì)象(裝飾器)來包裹真實(shí)對(duì)象,增加額外功能。
3.接口一致性:裝飾器與真實(shí)對(duì)象有相同的接口,確保客戶端能以相同的方式與兩者交互。
4.開閉原則:對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉。新的功能通過添加裝飾器實(shí)現(xiàn),而不是修改原類。
5.靈活組合:允許通過組合多個(gè)裝飾器來創(chuàng)建功能更為豐富的對(duì)象
模式角色
1.抽象組件(Component):定義一個(gè)接口,用于規(guī)范準(zhǔn)備接收附加責(zé)任的對(duì)象(即被裝飾對(duì)象)。
2.具體組件(ConcreteComponent):實(shí)現(xiàn)抽象組件接口,是裝飾器要裝飾的真實(shí)對(duì)象。
3.裝飾器(Decorator):持有一個(gè)抽象組件的引用,并繼承抽象組件的接口。它既可以使用所持有的引用調(diào)用被裝飾的組件的方法,也可以增加新的功能。
4.具體裝飾器(ConcreteDecorator):實(shí)現(xiàn)裝飾器接口并給具體組件添加職責(zé)。它通常包含對(duì)具體組件的引用,以及一個(gè)或多個(gè)用于增加功能的額外方法。
這些角色在裝飾模式中的交互方式是:
- 抽象組件定義了所有裝飾器對(duì)象和被裝飾對(duì)象需要實(shí)現(xiàn)的接口。
- 具體組件實(shí)現(xiàn)了抽象組件接口,是準(zhǔn)備被裝飾的對(duì)象。
- 裝飾器持有一個(gè)對(duì)抽象組件的引用,并且實(shí)現(xiàn)了抽象組件接口。它可以使用這個(gè)引用來調(diào)用被裝飾對(duì)象的方法,并在調(diào)用前后添加新的功能。
- 具體裝飾器實(shí)現(xiàn)了裝飾器接口,并且給具體組件添加新的職責(zé)。它通常包含一個(gè)指向被裝飾對(duì)象的引用,以及用于實(shí)現(xiàn)附加功能的代碼。
模式的UML類圖
應(yīng)用場(chǎng)景
- 當(dāng)需要為單個(gè)對(duì)象提供多種不同的行為或者表現(xiàn)形式時(shí)。
- 需要向一個(gè)已經(jīng)存在的類中添加功能,但又不希望修改該類的源代碼或繼承其子類時(shí)
- 組合對(duì)象:當(dāng)需要組合多個(gè)對(duì)象來創(chuàng)建一個(gè)具有更多功能的對(duì)象時(shí),裝飾模式是一個(gè)很好的選擇。通過遞歸組合方式,可以構(gòu)建出一個(gè)具有多種功能的對(duì)象。例如,在文件系統(tǒng)中,文件夾可以被視為一個(gè)特殊的文件,它可以包含其他文件和文件夾。使用裝飾模式,可以將文件夾裝飾為一個(gè)包含額外功能的對(duì)象,如支持加密、壓縮等
模式優(yōu)點(diǎn)
- 動(dòng)態(tài)地給對(duì)象添加功能,相比生成子類更加靈活、透明。
- 無需修改原有類就可以擴(kuò)展功能,符合開閉原則。
- 裝飾器可以被組合,以便在運(yùn)行時(shí)動(dòng)態(tài)地、多次地添加多個(gè)職責(zé)。
模式缺點(diǎn)
- 這種比繼承更加靈活機(jī)動(dòng)的特性,也同時(shí)意味著更加多的復(fù)雜性。
- 裝飾模式會(huì)導(dǎo)致設(shè)計(jì)中出現(xiàn)許多小類,如果過度使用,會(huì)使程序變得很復(fù)雜。
- 不易調(diào)試:由于裝飾器模式涉及到多個(gè)對(duì)象的交互,調(diào)試可能會(huì)變得相對(duì)困難。特別是當(dāng)裝飾器鏈很長(zhǎng)時(shí),追蹤請(qǐng)求和響應(yīng)的路徑可能會(huì)變得復(fù)雜。
實(shí)例演示
圖示
雞腿堡應(yīng)用:
代碼演示
package ZhuangShiMoShi;public abstract class Humburger {protected String name;public String getName() {return name;}public abstract double getPrice();}package ZhuangShiMoShi;public class ChickenBurger extends Humburger {public ChickenBurger(){name="雞腿堡";}public double getPrice(){return 10;}}package ZhuangShiMoShi;public abstract class Condiment extends Humburger {protected Humburger humburger;public abstract String getName();}package ZhuangShiMoShi;public class Chilli extends Condiment {public Humburger hum;public Chilli(Humburger hum) {this.hum = hum;}@Overridepublic String getName() {// TODO Auto-generated method stubreturn hum.getName() + " 加辣椒";}@Overridepublic double getPrice() {// TODO Auto-generated method stubreturn hum.getPrice();}}package ZhuangShiMoShi;public class Lettuce extends Condiment {public Humburger hum;public Lettuce(Humburger hum) {this.hum = hum;}@Overridepublic String getName() {// TODO Auto-generated method stubreturn hum.getName()+" 加生菜";}@Overridepublic double getPrice() {// TODO Auto-generated method stubreturn hum.getPrice()+1.5;}}
測(cè)試類:
package ZhuangShiMoShi;public class Test {public static void main(String[] args) {Humburger hum = new ChickenBurger();System.out.println(hum.getName() + " 價(jià)錢:" + hum.getPrice());Lettuce lettuce=new Lettuce(hum);System.out.println(lettuce.getName()+" 價(jià)錢:"+lettuce.getPrice());Chilli chilli1=new Chilli(hum);System.out.println(chilli1.getName()+" 價(jià)錢:"+chilli1.getPrice());Chilli chilli2=new Chilli(lettuce);System.out.println(chilli2.getName()+" 價(jià)錢:"+chilli2.getPrice());}}
運(yùn)行結(jié)果
該代碼主體是雞腿堡,可以選擇通過添加生菜、醬、辣椒等等許多其他的配料,并根據(jù)選擇的配料計(jì)算相應(yīng)的價(jià)格。
博主用心寫,讀者點(diǎn)關(guān)注;互動(dòng)傳真情,知識(shí)不迷路