在沒必要改變原類文件和使用繼承的狀況下,動態地擴展一個對象的功能。它是經過建立一個包裝對象,也就是裝飾來包裹真實的對象。html
(1)抽象構件(Component)角色:給出一個抽象接口,以規範準備接收附加職責的對象。
(2)具體構件(Concrete Component)角色:定義一個將要接收附加職責的類。
(3)裝飾(Decorator)角色:持有一個構件(Component)對象的實例,並實現一個與抽象構件接口一致的接口,從外類來擴展Component類的功能,但對於Component類來講,是無需知道Decorato的存在的。
(4)具體裝飾(Concrete Decorator)角色:負責給構件對象添加上附加的職責。java
(1)裝飾對象和真實對象有相同的接口。這樣客戶端對象就能以和真實對象相同的方式和裝飾對象交互。
(2)裝飾對象包含一個真實對象的引用。
(3)裝飾對象接受全部來自客戶端的請求。它把這些請求轉發給真實的對象。
(4)裝飾對象能夠在轉發這些請求之前或之後增長一些附加功能。這樣就確保了在運行時,不用修改給定對象的結構就能夠在外部增長附加的功能。在面向對象的設計中,一般是經過繼承來實現對給定類的功能擴展。設計模式
(1)須要擴展一個類的功能,或給一個類添加附加職責。
(2)須要動態的給一個對象添加功能,這些功能能夠再動態的撤銷。
(3)須要增長由一些基本功能的排列組合而產生的很是大量的功能,從而使繼承關係變的不現實。
(4)當不能採用生成子類的方法進行擴充時。一種狀況是,可能有大量獨立的擴展,爲支持每一種組合將產生大量的子類,使得子類數目呈爆炸性增加。另外一種狀況多是由於類定義被隱藏,或類定義不能用於生成子類。ide
package com.ixunm.decorate; /** * 抽象構件(Component)角色:給出一個抽象接口,以規範準備接收附加責任的對象 */ public interface Component { // 簡單操做方法 public void sampleOperation(); }
package com.ixunm.decorate; /** * 具體構件(ConcreteComponent)角色:定義一個將要接收附加責任的類。 */ public class ConcreteComponent implements Component{ @Override public void sampleOperation() { // 寫相關的業務代碼 System.out.println("具體對象操做"); } }
package com.ixunm.decorate; /** * 裝飾(Decorator)角色:持有一個構件(Component)對象的實例,並定義一個與抽象構件接口一致的接口。 */ public class Decorator implements Component{ private Component component; /** * 構造方法初始化抽象構件對象 * @param component */ public Decorator(Component component) { this.component = component; } @Override public void sampleOperation() { // 委派給構件對象處理 if (component != null) { component.sampleOperation(); } } }
package com.ixunm.decorate; /** * 具體裝飾角色ConcreteDecorator01:本類的獨有功能 * 具體裝飾(ConcreteDecorator)角色:負責給構件對象「貼上」附加的責任。 */ public class ConcreteDecorator01 extends Decorator{ /** * 構造方法初始化抽象構件對象 * * @param component */ public ConcreteDecorator01(Component component) { super(component); } @Override public void sampleOperation() { super.sampleOperation(); // 執行原Component的sampleOperation()方法 // 本類的獨有功能:寫相關的業務代碼 System.out.println("具體裝飾對象ConcreteDecorator01的操做"); } }
package com.ixunm.decorate; /** * 具體裝飾角色ConcreteDecorator02:本類的獨有功能 * 具體裝飾(ConcreteDecorator)角色:負責給構件對象「貼上」附加的責任。 */ public class ConcreteDecorator02 extends Decorator{ /** * 構造方法初始化抽象構件對象 * * @param component */ public ConcreteDecorator02(Component component) { super(component); } @Override public void sampleOperation() { super.sampleOperation(); // 執行原Component的sampleOperation()方法 // 本類的獨有功能:寫相關的業務方法,執行相關的業務 mySampleOperation(); } /** * 本類的獨有功能 */ private void mySampleOperation() { System.out.println("具體裝飾對象ConcreteDecorator02的操做"); } }
package com.ixunm.decorate; public class Demo { public static void main(String[] args) { ConcreteComponent concreteComponent = new ConcreteComponent(); ConcreteDecorator01 decorator01 = new ConcreteDecorator01(concreteComponent); ConcreteDecorator02 decorator02 = new ConcreteDecorator02(concreteComponent); decorator01.sampleOperation(); decorator02.sampleOperation(); } }
java中的io流的設計模式,用到裝飾模式測試
www.cnblogs.com/wxgblogs/p/5649933.htmlthis