JAVA裝飾者模式(從現(xiàn)實(shí)生活角度理解代碼原理)
裝飾者模式可以動(dòng)態(tài)地給一個(gè)對(duì)象添加一些額外的職責(zé)。就增加功能來說,Decorator模式相比生成子類更為靈活。
該模式的適用環(huán)境為:
(1)在不影響其他對(duì)象的情況下,以動(dòng)態(tài)、透明的方式給單個(gè)對(duì)象添加職責(zé)。
(2)處理那些可以撤消的職責(zé)。
(3)當(dāng)不能采用生成子類的方法進(jìn)行擴(kuò)充時(shí)。一種情況是,可能有大量獨(dú)立的擴(kuò)展,為支持每一種組合將產(chǎn)生大量的子類,使得子類數(shù)目呈爆炸性增長。另一種情況可能是因?yàn)轭惗x被隱藏,或類定義不能用于生成子類。
實(shí)現(xiàn)該模式的關(guān)鍵步驟:
(1)Component(被裝飾對(duì)象基類):定義對(duì)象的接口,可以給這些對(duì)象動(dòng)態(tài)增加職責(zé);
(2)ConcreteComponent(具體被裝飾對(duì)象):定義具體的對(duì)象,Decorator可以給它增加額外的職責(zé);
(3)Decorator(裝飾者抽象類):維護(hù)指向Component實(shí)例的引用,定義與Component一致的接口(也就是要繼承或?qū)崿F(xiàn)被裝飾對(duì)象基類);
(4)ConcreteDecorator(具體裝飾者):具體的裝飾對(duì)象,給內(nèi)部持有的具體被裝飾對(duì)象增加具體的職責(zé);
這樣講大家可能有些不好理解,那我們還是老規(guī)矩安靜:
入冬以后天氣越來越冷了,下班之后,做為資深吃貨,約上二三好友痛快的來場火鍋盛宴再爽不過了。說到火鍋,不得不提在成都吃過的大龍燚火鍋,各種鍋底,配菜應(yīng)有盡有,但我最喜歡的還是大龍燚火鍋原味鍋底、麻辣牛肉、大刀毛肚、天味香腸、砣砣牛肉、麻辣排骨等,想想都流口水啊。
說道這大家結(jié)合裝飾者的實(shí)現(xiàn)步驟,應(yīng)該有點(diǎn)感覺了吧,上文提到的鍋底,其實(shí)就是被裝飾對(duì)象的基類,配料其實(shí)就是裝飾者抽象類,大龍燚火鍋原味鍋底這些具體的鍋底也就是具體的被裝飾對(duì)象了,麻辣牛肉、大刀毛肚、天味香腸、砣砣牛肉、麻辣排骨這些裝飾鍋底用的各種配菜也就是具體的裝飾對(duì)象。說道這,大家應(yīng)該都豁然開朗了吧,下面我們開始具體的代碼實(shí)現(xiàn):
第一步:定義被裝飾對(duì)象基類(可以是抽象類也可以是接口)
public interface GuoDi { public float cost();//鍋底當(dāng)然要有價(jià)錢啦 public String name();//名字也得有哦 }
第二步:定義具體被裝飾對(duì)象(也就是各種鍋底,這里定義兩種)
public class YuanYang implements GuoDi { @Override public float cost() { return 48.0f; } @Override public String name() { return "鴛鴦鍋底"; } } public class DaLongYan implements GuoDi{ @Override public float cost() { return 59.0f; } @Override public String name() { return "大龍燚火鍋原味鍋底"; } }
第三步:定義裝飾者抽象類
public abstract class PeiCai implements GuoDi { private GuoDi guodi; public FoodDecorator(GuoDi guodi) { super(); this.guodi = guodi; } @Override public float cost() { return guodi.cost(); } @Override public String name() { return guodi.name(); } }
第四步:定義具體的裝飾者對(duì)象
public class MaLaNiuRou extends PeiCai { public MaLaNiuRou(GuoDi guodi) { super(guodi); } @Override public float cost() { return super.cost()+46f; } @Override public String name() { return super.name()+"+麻辣牛肉"; } } public class MaoDu extends PeiCai { public MaoDu(GuoDi guodi) { super(guodi); } @Override public float cost() { return super.cost()+30f; } @Override public String name() { return super.name()+"+大刀毛肚"; } }
測試類:
public class Test { public static void main(String[] args) { GuoDi guodi = new DaLongYan ();//點(diǎn)個(gè)大龍燚火鍋原味鍋底 MaLaNiuRou y = new MaLaNiuRou(guodi);//來個(gè)麻辣牛肉 MaoDu x = new MaoDu(y);//在麻辣牛肉的基礎(chǔ)上再來個(gè)大刀毛肚 System.out.println("一共點(diǎn)了"+x.name()+",共消費(fèi)"+s.cost()); } }
輸出結(jié)果:
1 一共點(diǎn)了大龍燚火鍋原味鍋底+麻辣牛肉+大刀毛肚,共消費(fèi)135
以上所述是小編給大家介紹的JAVA裝飾者模式(從現(xiàn)實(shí)生活角度理解代碼原理),希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- Java設(shè)計(jì)模式之裝飾者模式詳解和代碼實(shí)例
- 舉例講解Java設(shè)計(jì)模式編程中Decorator裝飾者模式的運(yùn)用
- Java裝飾者模式實(shí)例詳解
- Java基于裝飾者模式實(shí)現(xiàn)的圖片工具類實(shí)例【附demo源碼下載】
- Java基于外觀模式實(shí)現(xiàn)美食天下食譜功能實(shí)例詳解
- Java基于享元模式實(shí)現(xiàn)五子棋游戲功能實(shí)例詳解
- Java基于中介者模式實(shí)現(xiàn)多人聊天室功能示例
- Java使用觀察者模式實(shí)現(xiàn)氣象局高溫預(yù)警功能示例
- Java使用訪問者模式解決公司層級(jí)結(jié)構(gòu)圖問題詳解
- Java基于代理模式解決紅酒經(jīng)銷問題詳解
- Java基于裝飾者模式實(shí)現(xiàn)的染色饅頭案例詳解
相關(guān)文章
基于opencv+java實(shí)現(xiàn)簡單圖形識(shí)別程序
這篇文章主要給大家介紹了如何基于opencv+java實(shí)現(xiàn)簡單圖形識(shí)別程序的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-01-01springboot項(xiàng)目main函數(shù)啟動(dòng)的操作
這篇文章主要介紹了springboot項(xiàng)目main函數(shù)啟動(dòng)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06在jmeter的beanshell中用java獲取系統(tǒng)當(dāng)前時(shí)間的簡單實(shí)例
這篇文章介紹了在jmeter的beanshell中用java獲取系統(tǒng)當(dāng)前時(shí)間的簡單實(shí)例,有需要的朋友可以參考一下2013-09-09Springboot 讀取 yml 配置文件里的參數(shù)值
本文主要介紹了Springboot 讀取 yml 配置文件里的參數(shù)值,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12logback標(biāo)記日志過濾器MarkerFilter源碼解讀
這篇文章主要為大家介紹了logback標(biāo)記日志過濾器MarkerFilter源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11