首頁  >  文章  >  Java  >  裝飾模式

裝飾模式

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-05 03:40:02148瀏覽

什麼是裝飾者模式?

裝飾器模式是一種結構設計模式,它動態地將附加行為附加到物件上。裝飾器透過組合而不是子類化(繼承)提供靈活的擴展原因。

什麼時候使用它?

當您想透過在運行時添加小行為來建構物件時,請使用裝飾器模式。

UML圖

Decorator Pattern

裝飾器類別使用組合和繼承,理解它們的意圖至關重要。
在裝飾器模式中,我們對組件和裝飾器使用相同的類型。 Decorator 複合 Component 物件來取得行為,即取得 Component 物件中定義的欄位或方法。而Decorator繼承(擴展)了Component,使得Decorator物件可以宣告為Component物件。

裝飾器模式實現了開閉原則,即對擴展開放,對修改封閉。添加組件或裝飾器很容易。例如,如果你想添加另一個特定的裝飾器,你只需要建立一個代表它的類別並擴展裝飾器類別。

例子

想像一下我們正在為一家冰淇淋店開發一個系統。店裡有各種冰淇淋和配料。系統需要顯示冰淇淋的描述(包括其配料)和成本。

Decorator Pattern

  • 組件(冰淇淋)和裝飾器(配料)有公共介面 IceCream 類,它們都聲明為 IceCream 物件。
  • 每種特定冰淇淋都會涵蓋成本法,因為每種冰淇淋的價格都不同。
  • Topping 類別提供具體澆頭的介面並保存對 IceCream 的引用。
  • 如果系統需要其他配料,例如焦糖來源,您需要做的就是建立擴展 Topping 類別的 CaramelSource 類別。

Java 中的實作

冰淇淋課:

// Component class
public abstract class IceCream {

    public String description = "Unknown ice cream";

    public String getDescription() {
        return description;
    }

    public abstract double cost();
}

巧克力冰淇淋類:

// Concrete component class
public class ChocolateIceCream extends IceCream {

    public ChocolateIceCream() {
        description = "ChocolateIceCream";
    }

    @Override
    public double cost() {
        return 1.99;
    }
}

頂班:

// Base decorator class
public abstract class Topping extends IceCream {

    public IceCream iceCream;

    // All subclasses (concrete decorator classes) need to implement getDescription method,
    // by declaring this method as abstract, we enforce all subclasses to implement this method
    public abstract String getDescription();
}

楓堅果類:

// Concrete decorator class
public class MapleNuts extends Topping {

    public MapleNuts(IceCream iceCream) {
        this.iceCream = iceCream;
    }

    @Override
    public String getDescription() {
        return iceCream.getDescription() + ", MapleNuts";
    }

    @Override
    public double cost() {
        return iceCream.cost() + .30;
    }
}

PeanutButterShell 類別:

// Concrete decorator class
public class PeanutButterShell extends Topping {

    public PeanutButterShell(IceCream iceCream) {
        this.iceCream = iceCream;
    }

    @Override
    public String getDescription() {
        return iceCream.getDescription() + ", PeanutButterShell";
    }

    @Override
    public double cost() {
        return iceCream.cost() + .30;
    }
}

客戶端類別:

public class Client {

    public static void main(String[] args) {
        IceCream iceCream = new ChocolateIceCream();
        System.out.println(iceCream.getDescription() + ", $" + iceCream.cost());

        iceCream = new MapleNuts(iceCream);
        System.out.println(iceCream.getDescription() + ", $" + iceCream.cost());

        iceCream = new PeanutButterShell(iceCream);
        System.out.println(iceCream.getDescription() + ", $" + iceCream.cost());
    }
}

輸出:

ChocolateIceCream, .99
ChocolateIceCream, MapleNuts, .29
ChocolateIceCream, MapleNuts, PeanutButterShell, .59

您可以在這裡查看所有設計模式的實作。
GitHub 儲存庫


附註
我是剛開始寫科技博客,如果您對我的寫作有什麼建議,或者有任何困惑的地方,請留言!
感謝您的閱讀:)

以上是裝飾模式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn