设计模式—装饰者模式
1.概述
装饰者模式,动态地将责任附加到对象上。
装饰者模式在设计上类似一种递归的方式:
-
装饰者和被装饰者有相同的超类型。
-
可以用一个或多个装饰者包装一个对象。
装饰者可以在所委托被装饰者的行为之前或之后加上自己的行为,以达到特殊目的。
- 即装饰者和被装饰者有共同的超类,装饰者也可以是被装饰者,不同点在于装饰者类内部组和一个被装饰者。
2.类图
3.角色
- Component : 装饰者和被装饰者的共同的超类。
- Decorator :装饰抽象类,内部组和了一个Component。
- ConcreteComponent : 被装饰者的具体实现类。
- ConcreteComponentA :装饰者A。
- ConcreteComponentB :装饰着B。
4.实现
使用装饰者装饰被装饰者,同时装饰者也可以是被装饰者。
public interface Component {
void method();
}
public abstract class Decorator implements Component{
Component component;
public void setComponent(Component component){
this.component = component;
}
}
public class ConcreteComponent implements Component{
public void method() {
System.out.println("我是被装饰者");
}
}
public class ConcreteComponentA extends Decorator {
public void method() {
beforeDecorator();
component.method();
afterDecorator();
}
public void beforeDecorator(){
System.out.println(this.toString()+": 装饰者A装饰前");
}
public void afterDecorator(){
System.out.println(this.toString()+": 装饰者A装饰后");
}
}
public class ConcreteComponentB extends Decorator{
public void method() {
beforeDecorator();
component.method();
afterDecorator();
}
public void beforeDecorator(){
System.out.println(this.toString()+": 装饰者B装饰前--");
}
public void afterDecorator(){
System.out.println(this.toString()+": 装饰者B装饰后--");
}
}
测试:
main方法如下:
public class Main {
public static void main(String[] args) {
Component component = new ConcreteComponent();
Decorator decoratorA = new ConcreteComponentA();
Decorator decoratorB = new ConcreteComponentB();
//使用A装饰者装饰组件
System.out.println("----------------使用A装饰者装饰组件----------------------");
decoratorA.setComponent(component);
decoratorA.method();
//使用B装饰者装饰组件
System.out.println("----------------使用B装饰者装饰组件----------------------");
decoratorB.setComponent(component);
decoratorB.method();
//先使用A,在使用B装饰组件
System.out.println("---------------先使用A,在使用B装饰组件-------------------");
decoratorA.setComponent(component);
decoratorB.setComponent(decoratorA);
decoratorB.method();
//先使用B,在使用A装饰组件
System.out.println("---------------先使用B,在使用A装饰组件-------------------");
decoratorB.setComponent(component);
decoratorA.setComponent(decoratorB);
decoratorA.method();
}
}
结果:
5.JDK中的使用
java I/O中许多类都是装饰者类。