java設計模式之裝飾器模式

2021-07-29 12:46:36 字數 1681 閱讀 3279

一、裝飾器模式簡介

裝飾器模式可以動態給乙個物件新增一些額外的職責,同時又不改變其結構。就象在牆上刷油漆.使用decorator模式相比用生成子類方式達到功能的擴充顯得更為靈活。這種模式建立了乙個裝飾類,用來包裝原有的類,並在保持類方法簽名完整性的前提下,提供了額外的功能。

裝飾器模式的應用場景:

1、在不修改源**的情況下,擴充套件乙個類的功能。 

2、實現動態增加功能,動態撤銷。

二、示例演示

1、業務需求:

假設現在需要乙個漢堡,主體是雞腿堡,我們可以選擇新增生菜、醬、辣椒等等許多其他的配料,同時根據所加的配料情況,從新計算**。這種情況下就可以使用裝飾者模式。

2、首先定義乙個公共介面:所有漢堡和配料都必須實現該介面。(事實上漢堡本身也可以看作雞腿堡的乙個配料)

public inte***ce condiment

3、定義乙個雞腿堡的實現:(被裝飾者的初始狀態,有些自己的簡單裝飾)

public class chickenburger implements condiment     

public string getname()

public double getprice()

}

4、再定義各個配料的具體情況,這些配料就是裝飾者。

首先定義生菜配料:

public class lettuce implements condiment     

public string getname()

public double getprice()

}

在定義辣椒配料:

public class chilli implements condiment     

public string getname()

public double getprice()

}

4、測試:

public class test     

}

三、總結

從上面的實現的方式發現這看起來像是乙個物件一層一層包裝起來一樣,這也正是裝飾模式別名「包裝器」的由來。我的理解是這樣的:

1、裝飾模式的類lettuce和chilli其實是從公共介面類實現來的,也是用來裝飾condiment類的

2、同時在裝飾類中有乙個這樣的構造方法:

public lettuce(

condiment humburger)  

這個構造方法有點特殊的,引數是condiment型別,利用多型特性,這個使得一層一層裝飾成為了可能,也就是通過不斷的給乙個chickenburger物件增加功能變得極其方便;

3、還有一點就是體會一下在測試方法中具體使用。

humburger = new lettuce(humburger); //加入生菜,然後返回裝配好的例項

humburger = new chilli(humburger); //再加入辣椒,然後返回裝配好的例項

可以看出,我們每次用裝飾後的物件去覆蓋原物件,這樣做的實現原理是利用了多型性。即無論lettuce類物件還是chilli類物件,都是乙個condiment的例項。

java設計模式之裝飾器模式

裝飾器?故名思意,就是在不改變物件原有功能情況下增強該物件的功能。這裡面有兩點需要注意 裝飾類與被裝飾類必須繼承同一抽象類或實現同一介面。即要保持裝飾類與被裝飾類的功能一致。裝飾類在構建例項時必須要傳遞乙個父類的子類例項引數。即必須要有被裝飾的物件。結構 示例介面類 inte ce father v...

Java設計模式 裝飾器模式

我們 不從最基本的裝飾器模式概念入手 先來看問題好了。提出問題 假如 有以下海關入關通用處理方法 public class shanghaicustoms public class beijingcustoms 現在我們需要新加入需求,原先的處理流程不變,但是需要加入security checks和...

Java 設計模式 裝飾器模式

本文由 luzhuo 編寫,請保留該資訊.原文 裝飾模式可以動態的給乙個物件增加一些額外的功能 增強功能 相比於繼承,裝飾模式能對不支援繼承的類進行增強 並且比繼承更靈活,不需要生成大量的子類 public inte ce phonepublic final class phoneimpl impl...