1. 定义
动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式比生成子类更为灵活。
2. 结构图
Component:组件对象的接口,可以给这些对象动态地添加职责。
ConcreteComponent:具体的组件对象,实现组件对象接口,通常就是被装饰器装饰的原始对象,也就是可以给这个对象添加职责。
Decorator:所有装饰器的抽象父类,需要定义一个与组件接口一致的接口,并持有一个Component对象,其实就是持有一个被装饰的对象。注意这个被装饰的对象不一定是最原始的那个对象,也可能是被其他装饰器装饰过后的对象,反正都是实现的同一个接口,也就是同一类型。
ConcreteDecorator:实际的装饰器对象,实现具体要向被装饰器对象添加的功能。
3. 本质
装饰模式的本质:动态组合。
4. Code Demo
Component.java
package org.fool.decorator; public interface Component { public void doSomething(); }
ConcreteComponent.java
package org.fool.decorator; public class ConcreteComponent implements Component { @Override public void doSomething() { System.out.println("功能A"); } }
Decorator.java
package org.fool.decorator; public class Decorator implements Component { private Component component; public Decorator(Component component) { this.component = component; } @Override public void doSomething() { component.doSomething(); } }
ConcreteDecorator1.java
package org.fool.decorator; public class ConcreteDecorator1 extends Decorator { public ConcreteDecorator1(Component component) { super(component); } @Override public void doSomething() { super.doSomething(); this.doAnotherThing(); } private void doAnotherThing() { System.out.println("功能B"); } }
ConcreteDecorator2.java
package org.fool.decorator; public class ConcreteDecorator2 extends Decorator { public ConcreteDecorator2(Component component) { super(component); } @Override public void doSomething() { super.doSomething(); this.doAnotherThing(); } private void doAnotherThing() { System.out.println("功能C"); } }
Client.java
package org.fool.decorator; public class Client { public static void main(String[] args) { /* * //节点流 Component component = new ConcreteComponent(); * * //过滤流 Component component2 = new ConcreteDecorator1(component); * * component2.doSomething(); * * System.out.println("------------"); * * //过滤流 Component component3 = new ConcreteDecorator2(component2); * * component3.doSomething(); */ Component component = new ConcreteDecorator1(new ConcreteDecorator2(new ConcreteComponent())); component.doSomething(); } }
相关推荐
设计模式C++学习之装饰模式(Decorator)
动态地给一个对象添加一些额外的职责。就扩展功能而言,它比生成子类方式更为灵活。
C#设计模式之Decorator 装饰模式,pdf+视频教学,实例演示,易学易用~~
13、装饰模式DECORATOR PATTERN 14、迭代器模式ITERATOR PATTERN 15、组合模式COMPOSITE PATTERN 16、观察者模式OBSERVER PATTERN 17、责任链模式 18、访问者模式VISITOR PATTERN 19、状态模式 20、原型模式 21...
学习java 装饰模式(decorator)非常好的例子
5、装饰模式(Decorator) 用意:动态地给一个对象增加其它职责,比继承实现灵活。
装饰者模式(Decorator Pattern)是一种结构型设计模式,它的定义是在不改变原有对象结构的基础上,动态地给该对象增加一些职责(即增加其额外功能)。这种模式允许向一个现有的对象添加新的功能,同时又不改变其...
装饰器(Decorator)模式 详细教程,简明易懂,非常清晰的,附带有代码示例。
在这里与各位分享本人从网络上下载的C#面向对象设计模式纵横谈系列视频,共有25节,除了第一节需要各位贡献一点资源分以作为对本人上传资源的回馈,后面的其他资源均不需要... 这是第10节:结构型模式Decorator装饰模式
C#面向对象设计模式 Decorator 装饰模式 视频讲座下载
主要为大家详细介绍了.net设计模式之装饰模式Decorator,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
Head First 设计模式 (三) 装饰者模式(decorator pattern) C++实现 VS2012 下通过
装饰模式.doc 装饰模式.doc 装饰模式.doc
NULL 博文链接:https://chuanwang66.iteye.com/blog/1325151
NULL 博文链接:https://xiangtui.iteye.com/blog/1033790
主要介绍了Java设计模式之装饰模式(Decorator模式)介绍,本文讲解了为什么使用Decorator、如何使用装饰模式、Jive中的Decorator实现等内容,需要的朋友可以参考下
主要为大家详细介绍了C++设计模式之装饰模式Decorator的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
装饰模式的示例代码和文档,学习装饰模式的参考资料。
主要为大家详细介绍了java装饰模式Decorator Pattern,这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装,对装饰器模式感兴趣的小伙伴们可以参考一下
C#面向对象设计模式纵横谈(10):Decorator 装饰模式(结构型模式) (Level 300)