裝飾器模式是一種結構設計模式,它動態地將附加行為附加到物件上。裝飾器透過組合而不是子類化(繼承)提供靈活的擴展原因。
當您想透過在運行時添加小行為來建構物件時,請使用裝飾器模式。
裝飾器類別使用組合和繼承,理解它們的意圖至關重要。
在裝飾器模式中,我們對組件和裝飾器使用相同的類型。 Decorator 複合 Component 物件來取得行為,即取得 Component 物件中定義的欄位或方法。而Decorator繼承(擴展)了Component,使得Decorator物件可以宣告為Component物件。
裝飾器模式實現了開閉原則,即對擴展開放,對修改封閉。添加組件或裝飾器很容易。例如,如果你想添加另一個特定的裝飾器,你只需要建立一個代表它的類別並擴展裝飾器類別。
想像一下我們正在為一家冰淇淋店開發一個系統。店裡有各種冰淇淋和配料。系統需要顯示冰淇淋的描述(包括其配料)和成本。
冰淇淋課:
// 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中文網其他相關文章!