1. 程式人生 > >設計模式之裝飾者模式篇

設計模式之裝飾者模式篇

定義

動態的將責任附加到物件上。若要擴充套件此功能,裝飾者提供了比繼承更有彈性的替代方案。

類圖

這裡寫圖片描述

以賣飲料為例

程式碼實現

首先定義了一個抽象的飲料的父類,具有兩個方法,分別是描述資訊和價格

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
5; } } class Coffee2 extends Drink{ @Override public String getDescription() { return "Coffee2"; } @Override public double cost() { return 6; } }

最後看一下裝飾類,裝飾材料有牛奶,摩卡。當我們加上輔料時,就需要在未加輔料的基礎上加上輔料的價格,才是該型別飲料的真實價格。同理還需要在未加輔料的基礎上加上輔料的資訊形成該型別飲料的描述資訊。所以在實現的時候,我們只需要呼叫飲料的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()+1;
    }

}
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()+2;
    }

}

結果展示

這裡寫圖片描述

優點

  1. 允許行為可以擴充套件,而無需修改現有的程式碼
  2. 可以用無數個裝飾者裝飾一個元件

缺點

  1. 使用裝飾者模式容易出現許多小的物件類,如果過度使用,會使得程式變得很複雜

java中的裝飾者模式

java中有許多類也使用到來了裝飾者模式,比如檔案操作,感興趣的同學可以自行研究一下~