1.定义
- 动态的扩展对象功能(继承关系的替代方案之一)
2.UML类图
- 角色介绍
AbstractComponent : 抽象组件类
ConcreteComponent : 具体组建类,需要装饰的对象
AbstractDecorator : 抽象装饰者
ConcreteDecoratorA : 具体装饰者A
ConcreteDecoratorB : 具体装饰者B - 要点说明
有代理模式的影子,并在此基础上还增加了逻辑描述
动态的扩展ConcreteComponent的功能
3.UML示例代码
/**
* Copyright (C), 2016-2020
* FileName: AbstractComponent
* Author: wei.zheng
* Date: 2020/1/6 9:19
* Description: 抽象组件类
*/
public abstract class AbstractComponent {
public abstract void operate();
}
/**
* Copyright (C), 2016-2020
* FileName: ConcreteComponent
* Author: wei.zheng
* Date: 2020/1/6 9:20
* Description: 组件具体实现类
*/
public class ConcreteComponent extends AbstractComponent {
@Override
public void operate() {
System.out.println("Base operate.");
}
}
/**
* Copyright (C), 2016-2020
* FileName: AbstractDecorator
* Author: wei.zheng
* Date: 2020/1/6 9:21
* Description: 抽象装饰者类
*/
public abstract class AbstractDecorator extends AbstractComponent {
private AbstractComponent component;
public AbstractDecorator(AbstractComponent component) {
this.component = component;
}
@Override
public void operate() {
component.operate();
}
}
/**
* Copyright (C), 2016-2020
* FileName: ConcreteDecoratorA
* Author: wei.zheng
* Date: 2020/1/6 9:23
* Description: 装饰者具体实现类A, 扩展operate方法,添加了自己的私有方法
*/
public class ConcreteDecoratorA extends AbstractDecorator {
public ConcreteDecoratorA(AbstractComponent component) {
super(component);
}
@Override
public void operate() {
super.operate();
operateA();
}
private void operateA() {
System.out.println("DecoratorA operator.");
}
}
/**
* Copyright (C), 2016-2020
* FileName: ConcreteDecoratorB
* Author: wei.zheng
* Date: 2020/1/6 9:24
* Description: 装饰者具体实现类B
*/
public class ConcreteDecoratorB extends AbstractDecorator {
public ConcreteDecoratorB(AbstractComponent component) {
super(component);
}
@Override
public void operate() {
super.operate();
operateB();
}
private void operateB() {
System.out.println("DecoratorB operator.");
}
}
/**
* Copyright (C), 2016-2020
* FileName: Client
* Author: wei.zheng
* Date: 2020/1/6 9:25
* Description: 装饰者模式用户类
*/
public class Client {
public static void main(String[] args) {
AbstractComponent component = new ConcreteComponent();
AbstractDecorator decoratorA = new ConcreteDecoratorA(component);
decoratorA.operate();
AbstractDecorator decoratorB = new ConcreteDecoratorB(component);
decoratorB.operate();
}
}
// 运行结果,ConcreteDecoratorA 与 ConcreteDecoratorB 均扩展了各自的operate方法
2020-01-07 08:47:22.568 9763-9763/? I/System.out: Base operate.
2020-01-07 08:47:22.568 9763-9763/? I/System.out: DecoratorA operator.
2020-01-07 08:47:22.568 9763-9763/? I/System.out: Base operate.
2020-01-07 08:47:22.568 9763-9763/? I/System.out: DecoratorB operator.
4.总结
Decorator Pattern 与 Proxy Pattern,二者有类似的地方,但是也要注意它们的区别:
代理模式 : 用代理对象间接的控制 Adaptee(被代理)对象,并没有扩展Adaptee的功能
装饰模式 : 抽象装饰器类代理抽象组件类,具体装饰器继承抽象装饰器实现动态扩展功能