裝飾器設計模式
- 🚩什么是裝飾器設計模式?
- 🚩裝飾器設計模式的特點
- 🚩裝飾器設計模式的結構
- 🚩裝飾器設計模式的優缺點
- 🚩裝飾器設計模式的Java實現
- 🚩代碼總結
- 🚩總結
🚩什么是裝飾器設計模式?
裝飾器設計模式(Decorator Pattern) 是一種 結構型設計模式,它允許你通過將對象放入 特殊封裝對象 中來為原對象 動態添加新的行為。裝飾器模式的核心思想是 在不改變原對象結構的情況下,擴展其功能。
使用場景
-
當需要 動態地添加或撤銷對象的功能 時。
-
當 繼承不適合擴展功能 時(例如,子類數量爆炸或功能組合復雜)。
-
當需要 為對象添加多個獨立的功能,且這些功能可以自由組合時。
🚩裝飾器設計模式的特點
-
動態擴展:裝飾器模式允許在運行時動態地為對象添加功能。
-
靈活性:可以自由組合多個裝飾器,實現功能的疊加。
-
避免繼承:通過組合替代繼承,避免子類數量爆炸。
-
透明性:裝飾器對象與原對象具有相同的接口,客戶端無需知道是否被裝飾。
🚩裝飾器設計模式的結構
裝飾器模式主要包含以下部分:
-
Component(抽象組件):定義對象的接口,可以是抽象類或接口。
-
ConcreteComponent(具體組件):實現
Component
接口,是被裝飾的原始對象。 -
Decorator(抽象裝飾器):繼承或實現
Component
,并持有一個Component
對象的引用。 -
ConcreteDecorator(具體裝飾器):實現
Decorator
,為Component
添加新的行為。
圖例:
🚩裝飾器設計模式的優缺點
? 優點
-
動態擴展:可以在運行時動態地為對象添加功能。
-
靈活性:可以自由組合多個裝飾器,實現功能的疊加。
-
避免繼承:通過組合替代繼承,避免子類數量爆炸。
-
透明性:裝飾器對象與原對象具有相同的接口,客戶端無需知道是否被裝飾。
? 缺點
-
復雜性:裝飾器模式會增加系統的復雜性,尤其是在多層裝飾時。
-
調試困難:由于裝飾器是動態添加的,調試時可能難以追蹤具體的裝飾邏輯。
🚩裝飾器設計模式的Java實現
代碼地址:GitHub
- 創建
抽象組件 Person
,定義對象的接口。
/*** @author hanson.huang* @version V1.0* @ClassName Person* @Description 抽象組件 Person* @date 2025/3/24 15:35**/
public abstract class Person {protected String name;public abstract void Operation();// 職責
}
- 創建
具體組件 Student
,實現Person
接口。
/*** @author hanson.huang* @version V1.0* @ClassName Student* @Description 具體組件* @date 2025/3/24 15:41**/
public class Student extends Person {public Student(String name) {this.name = name;}@Overridepublic void Operation() {System.out.println(name + "的職責:學習 ");}
}
- 創建
抽象裝飾器 Decorator
,繼承Person
并持有一個Person 對象的引用
。
/*** @author hanson.huang* @version V1.0* @ClassName Decorator* @Description 抽象裝飾器* @date 2025/3/24 15:42**/
public abstract class Decorator extends Person {protected Person person;
}
-
創建 具體裝飾器
DecoratorA
和DecoratorB
,分別實現新的行為。- DecoratorA
/*** @author hanson.huang* @version V1.0* @ClassName DecoratorA* @Description 具體裝飾器 DecoratorA* @date 2025/3/24 15:42**/ public class DecoratorA extends Decorator {public DecoratorA(Person person) {this.person = person;}@Overridepublic void Operation() {// 職責person.Operation();// 原本的職責System.out.print("寫作業 ");} }
- DecoratorB
/*** @author hanson.huang* @version V1.0* @ClassName DecoratorB* @Description 具體裝飾器 DecoratorB* @date 2025/3/24 15:45**/ public class DecoratorB extends Decorator {public DecoratorB(Person person) {this.person = person;}@Overridepublic void Operation() {// 職責person.Operation(); // 原本的職責System.out.print("考試 ");} }
-
測試裝飾器模式
/*** @author hanson.huang* @version V1.0* @ClassName DecoratorPattern* @Description 測試裝飾器模式* @date 2025/3/24 15:46**/
public class DecoratorPattern {public static void main(String[] args) {Person zhangsan = new Student("張三");zhangsan= new DecoratorA(zhangsan);zhangsan= new DecoratorB(zhangsan);zhangsan.Operation();System.out.println("\n=====我是分割線=====");// 對象鏈Person lisi = new DecoratorB(new DecoratorA(new Student("李四")));lisi.Operation();}
}
📌 運行結果
🚩代碼總結
-
抽象組件 Person
定義對象的接口。 -
具體組件 Student
實現Person 接口
,是被裝飾的原始對象。 -
抽象裝飾器 Decorator
繼承Person
并持有一個Person 對象的引用
。 -
具體裝飾器 DecoratorA 和 DecoratorB
分別實現新的行為。 -
客戶端
通過組合裝飾器動態擴展對象的功能。
🚩總結
-
裝飾器設計模式(Decorator Pattern) 允許你通過將對象放入 特殊封裝對象 中來為原對象 動態添加新的行為。
-
適用于 動態擴展對象功能、避免繼承導致的子類數量爆炸 或 自由組合多個功能 的場景。
-
Java 實現 需要 定義抽象組件、具體組件、抽象裝飾器 和 具體裝飾器,并通過組合方式動態擴展功能。
? 適用場景:
-
需要 動態地添加或撤銷對象的功能 時。
-
當 繼承不適合擴展功能 時。
-
需要 為對象添加多個獨立的功能,且這些功能可以自由組合時。
-
Java中許多地方用到了裝飾器模式,例如,I/O流中的
InputStream
就是抽象的基礎組件,而,BufferedInputStream
和DataInputStream
屬于是裝飾器類。Java的Collections 集合類
中Collections.synchronizedList
方法返回的列表是裝飾后的組件,它具備了線程安全的特性
。