標籤:java設計模式 裝飾模式
一、概述
動態地給一個對象增加一些額外的職責,就增加對象功能來說,裝飾模式比產生子類實現更為靈活。裝飾模式是一種對象結構型模式。裝飾模式是一種用於替代繼承的技術,使用對象之間的關聯關係取代類之間的繼承關係。在裝飾模式中引入了裝飾類,在裝飾類中既可以調用待裝飾的原有類的方法,還可以增加新的方法,以擴充原有類的功能。
二、適用情境
裝飾原有對象、在不改變原有對象的情況下擴充增強新功能/新特徵.。當不能採用繼承的方式對系統進行擴充或者採用繼承不利於系統擴充和維護時可以使用裝飾模式。
三、UML類圖
四、參與者
①Component(抽象構件):它是具體構件和抽象裝飾類的共同父類,聲明了在具體構件中實現的業務方法。
②ConcreteComponent(具體構件):它是抽象構件類的子類,用於定義具體的構件對象(被裝飾者),實現了在抽象構件中聲明的方法,裝飾器可以給它增加額外的職責(方法)。
③Decorator(抽象裝飾類):它也是抽象構件類的子類,用於給具體構件增加職責,但是具體職責在其子類中實現。它維護一個指向抽象構件對象的引用,通過該引用可以調用裝飾之前構件對象的方法,並通過其子類擴充該方法,以達到裝飾的目的。
④ConcreteDecorator(具體裝飾類):它是抽象裝飾類的子類,負責向構件添加新的職責。每一個具體裝飾類都定義了一些新的行為,它可以調用在抽象裝飾類中定義的方法,並可以增加新的方法用以擴充對象的行為。
五、用例學習
1、角色:抽象構件 Component.java
/** * 設計模式之 裝飾模式<br/> * 角色:抽象構件<br/> * 被裝飾的對象抽象類別<br/> * @author [email protected] * */public abstract class Component { public abstract void operation();}
2、角色:具體構件類 ConcreteComponent.java
/** * 設計模式之 裝飾模式<br/> * 角色:具體構件類<br/> * 抽象構件類的子類,定義具體的構件對象,也就是具體的被裝飾對象<br/> * @author [email protected] * */public class ConcreteComponent extends Component { @Override public void operation() { System.out.println("我是具體的構件類(被裝飾對象),這是我的原有方法"); }}
3、角色:抽象裝飾類 Decorator.java
/** * 設計模式之 裝飾模式<br/> * 角色:抽象裝飾類<br/> * 也是抽象構件類的子類,目的是能夠進行多次裝飾<br/> * 作用:引入抽象構件類, 給具體構件類增加職責,但是具體職責在其子類中實現<br/> * @author [email protected] * */public class Decorator extends Component { // 維持一個對抽象構件對象的引用 private Component component; // 注入一個抽象構件類型的對象 public Decorator(Component component) { this.component = component; } @Override public void operation() { // 調用原有業務方法 component.operation(); }}
4、角色:具體裝飾類 ConcreteDecoratorA.java
/** * 設計模式之 裝飾模式<br/> * 角色:具體裝飾類<br/> * 向構件添加新的具體的職責、擴充原有對象的行為 * @author [email protected] * */public class ConcreteDecoratorA extends Decorator { public ConcreteDecoratorA(Component component) { super(component); } @Override public void operation() { super.operation(); // 調用增強業務方法,對原有對象進行裝飾、擴充、增強 addedBehavior(); } private void addedBehavior(){ System.out.println("我是具體的裝飾類A,我可以增強原有對象方法"); }}
5、角色:具體裝飾類 ConcreteDecoratorB.java
/** * 設計模式之 裝飾模式<br/> * 角色:具體裝飾類<br/> * 向構件添加新的具體的職責、擴充原有對象的行為 * @author [email protected] * */public class ConcreteDecoratorB extends Decorator { public ConcreteDecoratorB(Component component) { super(component); } @Override public void operation() { super.operation(); // 調用增強業務方法,對原有對象進行裝飾、擴充、增強 addedOtherBehavior(); } private void addedOtherBehavior(){ System.out.println("我是具體的裝飾類B,我也可以增強原有對象方法"); }}
6、用戶端測試類別 Client.java
public class Client { public static void main(String[] args) { Component component,decoratorA; component = new ConcreteComponent(); decoratorA = new ConcreteDecoratorA(component); // 對原有具體構件類ConcreteComponent的增強行為 decoratorA.operation(); System.out.println("---------------------------\n"); System.out.println("---對原有構件對象進行 decoratorA、decoratorB 二次裝飾---"); // 如果需要對原有構件對象裝飾後的decoratorA對象上進行再次裝飾 Component decoratorB; decoratorB = new ConcreteDecoratorB(decoratorA); decoratorB.operation(); }}
7、運行結果:
我是具體的構件類(被裝飾對象),這是我的原有方法我是具體的裝飾類A,我可以增強原有對象方法------------------------------對原有構件對象進行 decoratorA、decoratorB 二次裝飾---我是具體的構件類(被裝飾對象),這是我的原有方法我是具體的裝飾類A,我可以增強原有對象方法我是具體的裝飾類B,我也可以增強原有對象方法
六、其他
JAVA設計模式之 裝飾模式【Decorator Pattern】