特点
动态地给对象增加一些职责,即增加其额外的功能。
主要角色
- 抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象。
- 具体构件(Concrete Component)角色:实现抽象构件,通过装饰角色为其添加一些职责。
- 抽象装饰(Decorator)角色:继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。
- 具体装饰(ConcreteDecorator)角色:实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。
实现
public interface Component {
void method();
}
public class ConcreateComponent implements Component {
@Override
public void method() {
}
}
public abstract class Decorator implements Component {
protected Component component;
Decorator(Component component){
this.component = component;
}
}
public class ConcreteDecorator extends Decorator {
public ConcreteDecorator(Component component) {
super(component);
}
@Override
public void method() {
System.out.println("other action");
this.component.method();
}
}
装饰器模式看起来和代理模式在代码上没有什么差别,其实代理模式的关注点是对真实对象的隐藏,不会扩展新的功能;而装饰器模式是对具体构件的装饰,并对具体构件进行包装,以扩展新的功能。装饰者能够在运行时递归地被构造
public class ConcreteAfterDecorator extends Decorator {
public ConcreteAfterDecorator(Component component) {
super(component);
}
@Override
public void method() {
this.component.method();
System.out.println("after");
}
}
public class ConcreteBeforeDecorator extends Decorator {
public ConcreteBeforeDecorator(Component component) {
super(component);
}
@Override
public void method() {
System.out.println("before");
this.component.method();
}
}
public class T {
public static void main(String[] args) {
Decorator decorator = new ConcreteAfterDecorator(new ConcreteBeforeDecorator(new ConcreateComponent()));
decorator.method();
}
}
在该例中装饰器的构造被层层包装,递归构造。
网友评论