角色:被装饰者接口、被装饰者实现类、装饰者抽象类,装饰者实现类。
装饰者抽象类实现被装饰者接口,并持有一个被装饰者接口类型的对象,在继承的方法中先调用被装饰者对象的方法,再调用装饰者的代码。
本质跟AOP很像,不改变被装饰类,用装饰类来扩展被装饰类的功能。像俄罗斯套娃一样可以不停的叠加装饰器。也可以随时抽取被装饰对象直接调用被装饰对象原方法,实现撤销装饰的功能,如果有多层装饰,可以采用递归方法获取被装饰者。
Java中常用的例子:文件输入流作为被装饰类,
FileInputStream in = new FileInputStream();
它的装饰类有:
缓冲输入流 in = new BufferedInputStream(in)。
字符输入流 Reader reader = new InputStreamReader(in);
字符缓冲输入流 BufferedReader br = new BufferedRead(reader);
所有设计模式的目的都是代码复用和对象解耦

java
interface Component {
void operation();
}
class ConcreteComponent implements Component {
@Override
public void operation() {
System.out.println("Core functionality");
}
}
abstract class Decorator implements Component {
protected Component component;
public Decorator(Component c) {
this.component = c;
}
}
class ConcreteDecorator extends Decorator {
public ConcreteDecorator(Component c) {
super(c);
}
@Override
public void operation() {
component.operation();
addedBehavior();
}
private void addedBehavior() {
System.out.println("Added behavior");
}
}