Java裝飾者模式的示例詳解
定義
裝飾者模式:在不改變?cè)袑?duì)象的基礎(chǔ)之上,動(dòng)態(tài)的將功能附加到對(duì)象上,提供了繼承更有彈性的替代方案,也體現(xiàn)了開閉原則
案例
需求
一個(gè)人去咖啡店點(diǎn)了一杯卡布奇諾,加了一份熱牛奶
方案
定義咖啡基類
public abstract class Coffee {
private String desc;
private float price;
public abstract float cost();
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
}定義卡布奇諾咖啡類,繼承咖啡基類
public class Cappuccino extends Coffee{
public Cappuccino(){
setDesc("點(diǎn)了一杯卡布奇諾");
setPrice(100);
}
@Override
public float cost() {
System.out.println("當(dāng)前價(jià)格為:" + super.getPrice());
return super.getPrice();
}
}定義裝飾者類
public class Decorator extends Coffee{
private Coffee coffee;
public Decorator(Coffee coffee){
this.coffee = coffee;
}
@Override
public float cost() {
return super.getPrice() + this.coffee.cost();
}
@Override
public String getDesc() {
return super.getDesc() + coffee.cost();
}
}定義熱牛奶類
public class HotMilk extends Decorator {
public HotMilk(Coffee coffee){
super(coffee);
setPrice(200);
setDesc("點(diǎn)了一杯熱牛奶");
}
}定義測(cè)試類
public class Test {
public static void main(String[] args) {
// 點(diǎn)了一杯卡布奇諾,還加了一份熱牛奶
Coffee coffee = new Cappuccino();
System.out.println(coffee.getDesc());
//System.out.println(coffee.getPrice());
System.out.println(coffee.cost());;
HotMilk hotMilk = new HotMilk(coffee);
System.out.println(hotMilk.getDesc());
//System.out.println(hotMilk.getPrice());
System.out.println(hotMilk.cost());
}
}查看測(cè)試結(jié)果

分析
裝飾者模式的目的也是為了擴(kuò)展對(duì)象的功能,是繼承的一個(gè)替代模式,可以動(dòng)態(tài)的擴(kuò)展一個(gè)實(shí)現(xiàn)類的功能,裝飾類和被裝飾類可以相互獨(dú)立,不會(huì)耦合,靈活方便。
使用場(chǎng)景
- 需要給一個(gè)現(xiàn)有類添加職責(zé),但是有不能采用生成子類的方式去擴(kuò)充的時(shí)候,
- 當(dāng)需要對(duì)于現(xiàn)有的一組基本功能進(jìn)行組合,會(huì)產(chǎn)生非常多的功能的時(shí)候
- 當(dāng)對(duì)象的功能要求可以動(dòng)態(tài)的添加,或者說的動(dòng)態(tài)的撤銷
知識(shí)點(diǎn)補(bǔ)充
裝飾模式的定義和特點(diǎn)
在軟件開發(fā)過程中,有時(shí)想用一些現(xiàn)存的組件。這些組件可能只是完成了一些核心功能。但在不改變其結(jié)構(gòu)的情況下,可以動(dòng)態(tài)地?cái)U(kuò)展其功能。所有這些都可以釆用裝飾器模式來實(shí)現(xiàn)。
就像我們做菜,需要用到調(diào)料,菜,刀,火等一系列抽象的組件來最終完成一道菜。
裝飾模式的定義:
指在不改變現(xiàn)有對(duì)象結(jié)構(gòu)的情況下,動(dòng)態(tài)地給該對(duì)象增加一些職責(zé)(即增加其額外功能)的模式,它屬于對(duì)象結(jié)構(gòu)型模式。就增加功能來說,裝飾模式比生成子類更加靈活。
特點(diǎn):
- 裝飾器是繼承的有力補(bǔ)充,比繼承靈活,在不改變?cè)袑?duì)象的情況下,動(dòng)態(tài)的給一個(gè)對(duì)象擴(kuò)展功能,即插即用
- 通過使用不用裝飾類及這些裝飾類的排列組合,可以實(shí)現(xiàn)不同效果
- 裝飾器模式完全遵守開閉原則
缺點(diǎn)
裝飾器模式會(huì)增加許多子類,過度使用會(huì)增加程序得復(fù)雜性。
裝飾模式的結(jié)構(gòu)
裝飾模式的結(jié)構(gòu)一般包含以下幾個(gè)角色
1. 抽象構(gòu)件(Component)角色:定義一個(gè)抽象接口以規(guī)范準(zhǔn)備接收附加責(zé)任的對(duì)象。
2. 具體構(gòu)件(ConcreteComponent)角色:實(shí)現(xiàn)抽象構(gòu)件,通過裝飾角色為其添加一些職責(zé)。
3. 抽象裝飾(Decorator)角色:繼承抽象構(gòu)件,并包含具體構(gòu)件的實(shí)例,可以通過其子類擴(kuò)展具體構(gòu)件的功能。
4. 具體裝飾(ConcreteDecorator)角色:實(shí)現(xiàn)抽象裝飾的相關(guān)方法,并給具體構(gòu)件對(duì)象添加附加的責(zé)任。
到此這篇關(guān)于Java裝飾者模式的示例詳解的文章就介紹到這了,更多相關(guān)Java裝飾者模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中ThreadLocal線程變量的實(shí)現(xiàn)原理
本文主要介紹了Java中ThreadLocal線程變量的實(shí)現(xiàn)原理,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
SpringMVC核心DispatcherServlet處理流程分步詳解
這篇文章主要介紹了SpringMVC核心之中央調(diào)度器DispatcherServlet的相關(guān)知識(shí),包括SpringMVC請(qǐng)求處理過程及SrpingMVC容器和spring IOC容器關(guān)系,需要的朋友可以參考下2023-04-04
vue 使用vuex在頁面跳轉(zhuǎn)的實(shí)現(xiàn)方式
這篇文章主要介紹了vue 使用vuex在頁面跳轉(zhuǎn)的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
SpringSecurity框架下實(shí)現(xiàn)CSRF跨站攻擊防御的方法
CSRF是一種網(wǎng)絡(luò)攻擊方式,也可以說是一種安全漏洞,這種安全漏洞在web開發(fā)中廣泛存在。這篇文章主要介紹了SpringSecurity框架下實(shí)現(xiàn)CSRF跨站攻擊防御,需要的朋友可以參考下2019-12-12
java設(shè)計(jì)簡單學(xué)生管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了java設(shè)計(jì)簡單學(xué)生管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09
java操作Redis緩存設(shè)置過期時(shí)間的方法
這篇文章主要介紹了java操作Redis緩存設(shè)置過期時(shí)間的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06

