简介
在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。重在装饰和增强。
角色划分
抽象组件(Component):定义一个将要接收附加责任的类,即继承该抽象类的类都有了装饰和被装饰的能力。
具体组件(ConcreteComponent):可以被动态加上新行为,被装饰者修饰的类。
装饰者(Decorator):装饰者抽象类,继承该类都具有装饰者的能力。
具体装饰者(ConcreteDecorator):为具体组件添加新行为。
代码实现
//抽象组件
public abstract class Component {
public abstract void way();
}
//具体组件(最终被装饰的类)
public class RealComponent extends Component {
@Override
public void way() {
System.out.println("doSomething");
}
}
//抽象装饰者
public class Decorator extends Component {
@Autowired
private Component component;
//委托给被装饰者执行
@Override
public void way() {
this.component.way();
}
}
//具体装饰类
public class RealDecorator extends Decorator {
public RealDecorator(Component component) {
super(component);
}
private void before() {
System.out.println("在调用way方法前执行");
}
@Override
public void operate() {
//调用前就行装饰
this.before();
//调用具体被装饰类的方法
super.way();
//调用后进行装饰
this.after();
}
private void after() {
System.out.println("在调用way方法后执行");
}
}
//使用
public class App {
public static void main(String[] args) {
Component co = new RealComponent();
Decorator dec = new RealDecorator(com);
dec.way();
}
}
优缺点
装饰类和被装饰类可以独立发展,而不会相互耦合。
装饰模式是继承关系的一种替代方案。
装饰模式可以动态扩展一个实现类的功能。
多层装饰比较复杂