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

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

公司安全軟件導致部分應用無法正常運行的排查與解決方法許多公司為了保障內部網絡安全,會部署安全軟件。 ...

將姓名轉換為數字以實現排序的解決方案在許多應用場景中,用戶可能需要在群組中進行排序,尤其是在一個用...

系統對接中的字段映射處理在進行系統對接時,常常會遇到一個棘手的問題:如何將A系統的接口字段有效地映�...

在使用IntelliJIDEAUltimate版本啟動Spring...

在使用MyBatis-Plus或其他ORM框架進行數據庫操作時,經常需要根據實體類的屬性名構造查詢條件。如果每次都手動...

Java對象與數組的轉換:深入探討強制類型轉換的風險與正確方法很多Java初學者會遇到將一個對象轉換成數組的�...

Redis緩存方案如何實現產品排行榜列表的需求?在開發過程中,我們常常需要處理排行榜的需求,例如展示一個�...

電商平台SKU和SPU表設計詳解本文將探討電商平台中SKU和SPU的數據庫設計問題,特別是如何處理用戶自定義銷售屬...
