设计模式--装饰器模式

装饰模式(Decorator Pattern) :动态地给一个对象增加一些额外的职责(Responsibility),装饰模式可以在不需要创造更多子类的情况下,将对象的功能加以扩展。 与继承关系相比,关联关系的主要优势在于不会破坏类的封装性,而且继承是一种耦合度较大的静态关系,无法在程序运行时动态扩展。

装饰模式包含如下角色:

• Component: 抽象构件

• ConcreteComponent: 具体构件

• Decorator: 抽象装饰类

• ConcreteDecorator: 具体装饰类

其UML图如下:

Component 是一个接口或者是抽象类,就是定义我们最核心的对象,也就是最原始的对象。在装饰模式中,必然有一个被提取出来最核心、最原始、最基本的接口或抽象类Component。 

ConcreteComponent 这个是最核心、最原始、最基本的接口或抽象类的实现,你要装饰的就是这个对象。 

Decorator 一般是一个抽象的装饰类,用于拓展Component中的功能。实现接口或者抽象方法,它里面可不一定有抽象的方法呀,在它的属性里必然有一个 private 变量指向 Component。 

ConcreteDecoratorA 和 ConcreteDecoratorB 是两个具体的装饰类,你要把你最核心的、最原始的、最基本的东西装饰成什么。

装饰模式是对继承的有力补充,继承可不是万能的,继承可以解决很多实际的问题,但是在一些情况下你要是用继承就会增加很多子类,灵活性非常的差,也非常难以维护,在这样的情形下,装饰模式可以替代继承。


继承是静态的给类增加功能,而装饰模式则是动态的给增加功能,如果业务临时变更,基于继承实现的代码很可能就需要修改程序,而装饰模式就不需要修改代码。具有良好的拓展性。

装饰模式的优点:

• 装饰模式与继承关系的目的都是要扩展对象的功能,但是装饰模式可以提供比继承更多的灵活性。 

• 可以通过一种动态的方式来扩展一个对象的功能,通过配置文件可以在运行时选择不同的装饰器,从而实现不同的行为。

• 通过使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合。可以使用多个具体装饰类来装饰同一对象,得到功能更为强大的对象。

• 具体构件类与具体装饰类可以独立变化,用户可以根据需要增加新的具体构件类和具体装饰类,在使用时再对其进行组合,原有代码无须改变,符合“开闭原则”。

装饰模式的应用:

Java I/O 使用了装饰者模式来实现。以 InputStream 为例,InputStream 是抽象组件,FileInputStream 是 InputStream 的子类,属于具体组件,提供了字节流的输入操作。FilterInputStream 属于抽象装饰者,装饰者用于装饰组件,为组件提供额外的功能,例如 BufferedInputStream 为 FileInputStream 提供缓存的功能。

实例化一个具有缓存功能的字节流对象时,只需要在 FileInputStream 对象上再套一层 BufferedInputStream 对象即可。

原文地址:https://www.cnblogs.com/wbringarden/p/9550937.html