定義:在不必改變原類文件和使用繼承的情況下,動態地擴展一個對象的功能。它是通過創建一個包裝對象,也就是裝飾來包裹真實的對象。
特點:
(1) 裝飾對象和真實對像有相同的接口。這樣客戶端對象就能以和真實對象相同的方式和裝飾對象交互。
(2) 裝飾對象包含一個真實對象的引用(reference)
(3) 裝飾對象接受所有來自客戶端的請求。它把這些請求轉發給真實的對象。
(4) 裝飾對象可以在轉發這些請求以前或以後增加一些附加功能。這樣就確保了在運行時,不用修改給定對象的結構就可以在外部增加附加的功能。在面向對象的設計中,通常是通過繼承來實現對給定類的功能擴展。
企業級開發和常用框架中的應用:IO流底層架構
組成:
(1)抽象構件(Component)角色:給出一個抽象接口,以規範準備接收附加責任的對象。
(2)具體構件(Concrete Component)角色:定義一個將要接收附加責任的類。
(3)裝飾(Decorator)角色:持有一個構件(Component)對象的實例,並實現一個與抽象構件接口一致的接口。
(4)具體裝飾(Concrete Decorator)角色:負責給構件對象添加上附加的責任。
具體實例:
/** * 以下裝飾房子舉例*/public class Demo { public static void main(String[] args) { GenericHouse house = new GenericHouse(); Garage garage = new Garage(house); garage.doSomething(); Kitchen kitchen = new Kitchen(house); kitchen.doSomething(); }}/** * 抽象構件角色:一個接口,用以規範具體裝飾的位置*/interface AbstractHouse{ public void doSomething();}/** * 裝飾角色: 持有要裝飾的對象*/class Master implements AbstractHouse{ private AbstractHouse abstractHouse; public Master(AbstractHouse abstractHouse) { this.abstractHouse = abstractHouse; } public void doSomething() { System.out.println("裝飾角色:裝飾角色持有者,在這兒就是房子的主人"); abstractHouse.doSomething(); } }/** * 具體的構件角色:具體需要被裝飾的對象*/class GenericHouse implements AbstractHouse{ public void doSomething() { System.out.println("具體構建角色:房子可以住人,遮風擋雨!"); }}/** * 具體裝飾角色: 具體的裝飾就是在這兒做的,它繼承自裝飾角色,因為裝飾角色持有被裝飾對象, * 所以它也就持有了被裝飾對象,可以做裝飾*/class Garage extends Master{ public Garage(AbstractHouse abstractHouse) { super(abstractHouse); } public void doSomething() { super.doSomething(); System.out.println("具體裝飾角色:在這兒做裝飾的事兒,把房子中的一間裝飾成車庫,所以房子可以存放車子了"); }}/** * 具體裝飾角色: 具體的裝飾就是在這兒做的,它繼承自裝飾角色,因為裝飾角色持有被裝飾對象, * 所以它也就持有了被裝飾對象,可以做裝飾*/class Kitchen extends Master{ public Kitchen(AbstractHouse abstractHouse) { super(abstractHouse); } public void doSomething() { super.doSomething(); System.out.println("具體裝飾角色:在這兒做裝飾的事兒,把房子中的一間裝飾成廚房,所以房子可以做飯了"); }}在實際開發中,裝飾著模式的包裝作用有很大的作用,我們可以在不改變原來對象的情況下,對對像做一些其他的操作,這樣可以避免我們改造對象,但同時我們又可以很好的完成一些操作。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。