java設(shè)計模式系列之裝飾者模式
何為裝飾者模式 (Decorator)?
動態(tài)地給一個對象添加一些額外的職責(zé)。就增加功能來說,Decorator 模式相比生成子類更為靈活。
一、結(jié)構(gòu)
Component : 定義一個對象接口,可以給這些對象動態(tài)地添加職責(zé)。
interface Component { public void operation(); } ConcreteComponent : 實現(xiàn) Component 定義的接口。 class ConcreteComponent implements Component { @Override public void operation() { System.out.println("初始行為"); } }
Decorator : 裝飾抽象類,繼承了 Component, 從外類來擴展 Component 類的功能,但對于 Component 來說,是無需知道 Decorator 的存在的。
class Decorator implements Component { // 持有一個 Component 對象,和 Component 形成聚合關(guān)系 protected Component component; // 傳入要進一步修飾的對象 public Decorator(Component component) { this.component = component; } @Override // 調(diào)用要修飾對象的原方法 public void operation() { component.operation(); } }
ConcreteDecorator : 具體的裝飾對象,起到給 Component 添加職責(zé)的功能。
class ConcreteDecoratorA extends Decorator { private String addedState = "新屬性1"; public ConcreteDecoratorA(Component component) { super(component); } public void operation() { super.operation(); System.out.println("添加屬性: " + addedState); } } class ConcreteDecoratorB extends Decorator { public ConcreteDecoratorB(Component component) { super(component); } public void operation() { super.operation(); AddedBehavior(); } public void AddedBehavior() { System.out.println("添加行為"); } }
測試代碼
public class DecoratorPattern { public static void main(String[] args) { Component component = new ConcreteComponent(); component.operation(); System.out.println("======================================"); Decorator decoratorA = new ConcreteDecoratorA(component); decoratorA.operation(); System.out.println("======================================"); Decorator decoratorB = new ConcreteDecoratorB(decoratorA); decoratorB.operation(); } }
運行結(jié)果
初始行為 ====================================== 初始行為 添加屬性: 新屬性1 ====================================== 初始行為 添加屬性: 新屬性1 添加行為
二、應(yīng)用場景
1、需要動態(tài)的、透明的為一個對象添加職責(zé),即不影響其他對象。
2、需要動態(tài)的給一個對象添加功能,這些功能可以再動態(tài)的撤銷。
3、需要增加由一些基本功能的排列組合而產(chǎn)生的非常大量的功能,從而使繼承關(guān)系變的不現(xiàn)實。
4、當(dāng)不能采用生成子類的方法進行擴充時。一種情況是,可能有大量獨立的擴展,為支持每一種組合將產(chǎn)生大量的子類,使得子類數(shù)目呈爆炸性增長。另一種情況可能是因為類定義被隱藏,或類定義不能用于生成子類。
三、要點
1、裝飾對象和真實對象有相同的接口。這樣客戶端對象就能以和真實對象相同的方式和裝飾對象交互。
2、裝飾對象包含一個真實對象的引用(reference)。
3、裝飾對象接受所有來自客戶端的請求。它把這些請求轉(zhuǎn)發(fā)給真實的對象。
4、裝飾對象可以在轉(zhuǎn)發(fā)這些請求以前或以后增加一些附加功能。這樣就確保了在運行時,不用修改給定對象的結(jié)構(gòu)就可以在外部增加附加的功能。在面向?qū)ο蟮脑O(shè)計中,通常是通過繼承來實現(xiàn)對給定類的功能擴展。
以上就是關(guān)于java裝飾者模式的相關(guān)內(nèi)容介紹,希望對大家的學(xué)習(xí)有所幫助。
相關(guān)文章
分析Spring框架之設(shè)計與實現(xiàn)資源加載器
Spring框架是由于軟件開發(fā)的復(fù)雜性而創(chuàng)建的。然而,Spring的用途不僅僅限于服務(wù)器端的開發(fā)。從簡單性、可測試性和松耦合性角度而言,絕大部分Java應(yīng)用都可以從Spring中受益。今天來分析它的設(shè)計與實現(xiàn)資源加載器,從Spring.xml解析和注冊Bean對象2021-06-06Java基礎(chǔ)之finally語句與return語句詳解
這篇文章主要介紹了Java基礎(chǔ)之finally語句與return語句詳解,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04Java實現(xiàn)int、long、Integer、Long之間的相互轉(zhuǎn)換
本文主要介紹了Java實現(xiàn)int、long、Integer、Long之間的相互轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-08-08java實現(xiàn)在性能測試中進行業(yè)務(wù)驗證實例
這篇文章主要為大家介紹了java實現(xiàn)在性能測試中進行業(yè)務(wù)驗證實例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-07-07Java通過綁定實現(xiàn)快速將數(shù)據(jù)導(dǎo)出至Excel
把數(shù)據(jù)導(dǎo)出至?Excel?是很常見的需求,而數(shù)據(jù)的持久化,往往又放在數(shù)據(jù)庫中,因此把數(shù)據(jù)庫中的數(shù)據(jù)導(dǎo)出到?Excel中,成了非常普遍的一個需求,下面我們就來看看Java如何通過綁定實現(xiàn)快速將數(shù)據(jù)導(dǎo)出至Excel吧2023-10-10