一.定义
动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更加灵活。
二.类图
- Component抽象构件。这是一个接口或者抽象类,就是定义我们最核心、最原始的对象。
- ConcreteComponent具体构件。是最基本、最核心、最原始的接口或抽象类的实现,被装饰的对象。
- Decorator装饰角色。一般是个抽象类,实现接口或者抽象方法,里面不一定有抽象的方法,但是在它的属性里必然有一个private变量指向Component抽象构件。
三.优点
- 装饰类和被装饰类可以独立发展,而不会相互耦合。Component类无需知道Decorator类,Decorator也不用知道具体的构件。
- 装饰模式是继承关系的一个替代方案。不管装饰多少层,返回的还是父类Component.
- 装饰模式可以动态地扩展一个实现类的功能。
四.缺点
多层装饰是比较复杂的。
五.使用场景
- 需要扩展一个类的功能,或给一个类增加附加功能。
- 需要动态地给一个对象增加功能,这些功能可以再动态地撤销。
- 需要为一批兄弟类进行改装或加装功能。
六.注意事项
- 装饰模式是对继承的有力补充。
- 继承是静态地给类增加功能,而装饰模式则是动态地给增加功能。