來源:《設計模式之禪》java
定義:動態的給一個對象添加額外的職責。設計模式
抽象構件Component:定義抽象構件接口。ide
具體構件ConcreteComponent:實現抽象構件接口,須要裝飾的對象就是它。this
抽象裝飾角色Decorator:定義裝飾角色接口或方法,屬性中有一個指向抽象構件的private變量。設計
具體裝飾類ConcreteDecorator:實現抽象裝飾角色。code
類圖:component
代碼:對象
抽象構件:繼承
/** * */ package cc.rico.pattern.decorator; /** * @author rico * 抽象構件 */ public abstract class Component { /** * 抽象構件方法 */ public abstract void option(); }
具體構件:接口
/** * */ package cc.rico.pattern.decorator; /** * @author rico * 具體構件 */ public class ConcreteComponent extends Component { /* (non-Javadoc) * @see cc.rico.pattern.decorator.Component#option() */ @Override public void option() { System.out.println("###ConcreteComponent.option..."); } }
抽象裝飾器:
/** * */ package cc.rico.pattern.decorator; /** * @author rico * 抽象裝飾器 */ public class AbstractDecorator extends Component { private Component component = null; public AbstractDecorator(Component component) { this.component = component; } /* (non-Javadoc) * @see cc.rico.pattern.decorator.Component#option() */ @Override public void option() { component.option(); } }
具體裝飾器:
/** * */ package cc.rico.pattern.decorator; /** * @author rico * 具體裝飾器 */ public class ConcreteDecorator extends AbstractDecorator { public ConcreteDecorator(Component component) { super(component); } /* 重寫父類(non-Javadoc) * @see cc.rico.pattern.decorator.AbstractDecorator#option() */ @Override public void option() { this.decoration(); super.option(); } /** * 裝飾方法 */ private void decoration() { System.out.println("###ConcreteDecorator.decoration..."); } }
/** * */ package cc.rico.pattern.decorator; /** * @author rico * 具體裝飾類 */ public class ConcreteDecorator1 extends AbstractDecorator { public ConcreteDecorator1(Component component) { super(component); } /* 重寫父類方法(non-Javadoc) * @see cc.rico.pattern.decorator.AbstractDecorator#option() */ @Override public void option() { super.option(); this.decoration(); } /** * 裝飾方法 */ private void decoration() { System.out.println("####ConcreteDecorator1.decoration..."); } }
場景類:
/** * */ package cc.rico.pattern.decorator; /** * @author rico * 場景類 */ public class Client { /** * @param args */ public static void main(String[] args) { Component component = new ConcreteComponent(); component = new ConcreteDecorator(component); component = new ConcreteDecorator1(component); component.option(); } }
裝飾器模式優勢:
裝飾類和被裝飾類 不相互耦合。被裝飾類不用知道裝飾類的存在。裝飾類從外部擴展裝飾類的功能。
裝飾模式是繼承關係的一個替代方案。
裝飾模式能夠動態的擴展一個類的功能。
裝飾器模式缺點:
多層裝飾類複雜度比較高。
使用場景:
擴展一個類的功能,或者給一個類添加附加功能。
須要動態的給一個類添加功能,還能夠動態的撤銷。
擴展: