装饰器模式(Decorator Pattern)
装饰器模式(Decorator Pattern)属于结构型模式,该模式允许向一个现有的对象添加新的功能,同时又不改变其结构。装饰器模式以对客户端透明的方式拓展对象的功能,是继承关系的一种替代方案。
使用
在Java中的使用
(配合uml图)
//基础操作接口(组件)
interface Component {
public void sampleOpreation();
}
//具体操作,被装饰类(具体构建)
class ConcreteComponent implements Component {
@Override
public void sampleOpreation() {
// TODO 具体的基础相关代码
}
}
//装饰类,拥有被装饰类实例(装饰)
public class Decorator implements Component {
private Component component;
public Decorator(Component component) {
this.component = component;
}
@Override
public void sampleOpreation() {
//委派给构件
component.sampleOpreation();
}
}
//具体装饰类,继承自装饰类,在该类中具体给被装饰类装饰。
class ConcreteDecoratorA extends Decorator {
public ConcreteDecoratorA(Component component) {
super(component);
}
@Override
public void sampleOpreation() {
super.sampleOpreation();
//TODO 在基础代码实现的逻辑下实现拓展的操作
}
}
//同上,逻辑,与之不同的装饰操作
class ConcreteDecoratorB extends Decorator {
public ConcreteDecoratorB(Component component) {
super(component);
}
@Override
public void sampleOpreation() {
super.sampleOpreation();
//TODO 在基础代码实现的逻辑下实现拓展的操作
}
}
简介
目的:
- 在完成基础功能的前提下,动态地给一个对象添加一些额外的职责。
- 装饰器模式相比生成子类更为灵活的增加功能。
主要解决:
- 为了扩展一个类经常使用继承方式实现时,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。
何时使用:
- 在不想增加很多子类的情况下扩展类。
如何解决:
- 将具体功能职责划分作为具体装饰
UML
角色
- 抽象构件(Component):抽象接口,定义具体操作的接口。
- 具体构件(ConcreteComponent):被装饰的类,实现了
抽象构件(Component)
。 - 装饰(Decorator):实现了一个与
抽象构件(Component)
接口一致的接口,并且其中有一个抽象构件
对象的实例。 - 具体装饰(ConcreteDecorator):负责给构件对象添加附加责任。
优缺点
优点:
- 装饰类和被装饰类独立,互相无需知道对方的存在
- 装饰器模式是继承的一个替代模式,装饰器模式可以实现动态扩展,只要继承了装饰器就可以动态扩展想要的功能了。
缺点:
- 多层装饰比较复杂,提高了系统的复杂度。
使用场景:
- 扩展一个类的功能。
- 动态增加功能,动态撤销。
- 在不影响其它对象的情况下,以动态、透明的方式给单个对象添加职责
- 处理那些可以撤销的职责
- 当使用子类扩展的方式被束缚时(单继承),可考虑使用装饰器模式
的功能。 - 动态增加功能,动态撤销。
- 在不影响其它对象的情况下,以动态、透明的方式给单个对象添加职责
- 处理那些可以撤销的职责
- 当使用子类扩展的方式被束缚时(单继承),可考虑使用装饰器模式
- Java IO包中的类设计运用了装饰器模式