定義
動态的将責任附加到對象上。若要擴充此功能,裝飾者提供了比繼承更有彈性的替代方案。
類圖

以賣飲料為例
代碼實作
首先定義了一個抽象的飲料的父類,具有兩個方法,分别是描述資訊和價格
abstract class Drink{
String description="這是飲料";
public String getDescription(){
return description;
}
public abstract double cost();
}
其次定義了一個抽象的裝飾類,隻有一個描述方法
abstract class ComdientDecoration extends Drink{
public abstract String getDescription();
}
繼而定義了兩種coffee,繼承了Drink父類,并重寫了父類的描述資訊的方法,實作了價格方法。
class Coffee1 extends Drink{
@Override
public String getDescription() {
return "Coffee1";
}
@Override
public double cost() {
return ;
}
}
class Coffee2 extends Drink{
@Override
public String getDescription() {
return "Coffee2";
}
@Override
public double cost() {
return ;
}
}
最後看一下裝飾類,裝飾材料有牛奶,摩卡。當我們加上輔料時,就需要在未加輔料的基礎上加上輔料的價格,才是該類型飲料的真實價格。同理還需要在未加輔料的基礎上加上輔料的資訊形成該類型飲料的描述資訊。是以在實作的時候,我們隻需要調用飲料的cost方法再加上目前輔料的價格即可。同理描述資訊的實作為調用飲料的getDescription方法在加上目前輔料組成新的描述資訊
class Milk extends ComdientDecoration{
Drink drink;
public Milk(Drink drink){
this.drink=drink;
}
@Override
public String getDescription() {
return drink.getDescription()+", Milk";
}
@Override
public double cost() {
return drink.cost()+;
}
}
class Mocha extends ComdientDecoration{
Drink drink;
public Mocha(Drink drink) {
this.drink=drink;
}
@Override
public String getDescription() {
return drink.getDescription()+", Mocha";
}
@Override
public double cost() {
return drink.cost()+;
}
}
結果展示
優點
- 允許行為可以擴充,而無需修改現有的代碼
- 可以用無數個裝飾者裝飾一個元件
缺點
- 使用裝飾者模式容易出現許多小的對象類,如果過度使用,會使得程式變得很複雜
java中的裝飾者模式
java中有許多類也使用到來了裝飾者模式,比如檔案操作,感興趣的同學可以自行研究一下~