类图
定义
动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式相比生成子类更为灵活
优点
- 装饰类和被装饰类可以独立发展,而不会相互耦合
- 装饰模式是集成关系的一个替代方法,不管装饰多少层,其实现的还是 is-a 关系
- 装饰模式可以动态地扩展一个实现类的功能缺点
- 多层装饰比较复杂
使用场景
- 需要扩展一个类的功能,或给一个类增加附加功能
- 需要动态地给一个对象增加功能,这些功能可以再动态的撤销
- 需要为一批兄弟类进行改装或加装功能
抽象构件
public abstract class Component {
public abstract void operate();
}
具体构件
public class ConcreteComponent extends Component {
@Override
public void operate() {
System.out.println("ConcreteComponent->operate()");
}
}
抽象装饰者
public abstract class Decorator extends Component {
private Component component = null;
public Decorator(Component _component) {
this.component = _component;
}
@Override
public void operate() {
this.component.operate();
}
}
具体装饰者1
public class ConcreteDecorator1 extends Decorator {
/**
* @param _component 被装饰者
*/
public ConcreteDecorator1(Component _component) {
super(_component);
}
private void method1() {
System.out.println("method1修饰");
}
@Override
public void operate() {
this.method1();
super.operate();
}
}
具体装饰者2
public class ConcreteDecorator2 extends Decorator {
public ConcreteDecorator2(Component _component) {
super(_component);
}
private void method2() {
System.out.println("method2修饰");
}
public void operate() {
this.method2();
super.operate();
}
}
场景类
public class Client {
public static void main(String[] args) {
//被装饰者
Component component = new ConcreteComponent();
//装饰者1装饰
component = new ConcreteDecorator1(component);
//装饰者2装饰
component = new ConcreteDecorator2(component);
//执行被装饰后的方法
component.operate();
}
}
运行结果
method2修饰
method1修饰
ConcreteComponent->operate()