装饰模式(结构型模式) 装饰模式(Decorator),动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。[DP]
自己的理解:在不对原有类进行修改的情况下动态的对它进行扩展一些功能
优点:
缺点:
Component:装饰对象和被装饰对象的共同父类 ConcreteComponent:被装饰类,也为具体实现类 Decorator:装饰类,自装饰类的父类 ConcreteDecoratorA:子装饰类,提供特定的装饰 ConcreteDecoratorB:子装饰类,提供特定的装饰 更多的ConcreteDecorator(C,D,E,F)
例子:武装机甲,一台机甲,没有任何装备,现在需要给机甲装上各种装备,机甲是被装饰对象,给机甲新增装备为装饰类,动态的添加武器装备和防具装备 被装饰对象与装饰对象的共同父类 /** * @ Author :fonxi * @ Date :2019/5/13 3:02 * @ Description:装饰对象和被装饰对象的共同父类 */ public interface Component { void operation(); } 被装饰对象,拥有完整的操作 /** * @ Author :fonxi * @ Date :2019/5/13 3:06 * @ Description:被装饰者对象 机甲类 */ public class ConcreteComponent implements Component{ @Override public void operation() { System.out.println("末日机甲前来报道,装备:"); } } 装饰类,持有一个被装饰对象的引用,并且在被调用时,调用被装饰对象的方法 /** * @ Author :fonxi * @ Date :2019/5/13 3:09 * @ Description:装饰类 */ public abstract class Decorator implements Component { //持有一个被装饰对象的引用 private Component component; public void setComponent(Component component) { this.component = component; } @Override public void operation() { if(component != null){ component.operation(); } } } 子装饰类,在调用提供特定的装饰操作时,调用父类方法 /** * @ Author :fonxi * @ Date :2019/5/13 3:18 * @ Description:具体装饰类 机甲装备武器改装类 */ public class ConcreteDecoratorA extends Decorator{ @Override public void operation() { super.operation(); System.out.println("改装:等离子高频激光剑"); } } 同上 /** * @ Author :fonxi * @ Date :2019/5/13 3:28 * @ Description:具体装饰类 机甲装备防具改装类 */ public class ConcreteDecoratorB extends Decorator{ @Override public void operation() { super.operation(); System.out.println("改装:全适应立场防护盾"); } } 客户端调用类 /** * @ Author :fonxi * @ Date :2019/5/13 3:00 * @ Description:客户端调用类 */ public class TestController { public void print(){ ConcreteComponent concreteComponent = new ConcreteComponent(); ConcreteDecoratorA cA = new ConcreteDecoratorA(); ConcreteDecoratorB cB = new ConcreteDecoratorB(); cA.setComponent(concreteComponent); cB.setComponent(cA); cB.operation(); } }
输出结果: 末日机甲前来报到,装备: 改装:等离子高频激光剑 改装:全适应立场防护盾
装饰模式能动态的扩展一个类,并且不修改原来的类,能够灵活的增删,比继承要好。(感觉作用和代理模式有点象^_^) |
|