Java中的装饰器设计模式示例
装饰器设计模式用于在运行时修改对象的功能。
同时,同一类的其他实例将不受此影响,因此单个对象将获得修改后的行为。
装饰器设计模式是结构设计模式之一(例如适配器模式,桥接器模式,复合模式),并使用抽象类或者具有组成部分的接口来实现。
装饰设计模式
我们使用继承或者组合来扩展对象的行为,但这是在编译时完成的,并且适用于该类的所有实例。
我们无法添加任何新功能来删除运行时的任何现有行为-这是装饰器模式出现的时候。
假设我们要实现不同类型的汽车-我们可以创建接口Car来定义组装方法,然后我们可以拥有Basic汽车,此外,我们可以将其扩展到Sports car和Luxury Car。
实现层次结构如下图所示。
但是,如果我们要在运行时获得兼具运行车和豪华车功能的汽车,则实现会变得复杂,如果要进一步指定要首先添加哪些功能,则它会变得更加复杂。
现在想象一下,如果我们有十种不同类型的汽车,使用继承和组合的实现逻辑将无法管理。
为了解决这种编程情况,我们在Java中应用了装饰器模式。
我们需要以下类型来实现装饰器设计模式。
组件接口–定义将要实现的方法的接口或者抽象类。
在我们的例子中,"汽车"将成为组件接口。组件实现–组件接口的基本实现。
我们可以将BasicCar
类作为我们的组件实现。Decorator – Decorator类实现组件接口,并且与组件接口具有HAS-A关系。
子变量装饰器类应该可以访问component变量,因此我们将使此变量受保护。混凝土装饰器–扩展基本装饰器功能并相应地修改组件的行为。
我们可以将具体的装饰器类设置为" LuxuryCar"和" SportsCar"。
装饰器设计模式–类图
装饰设计模式测试程序
package com.theitroad.design.decorator; public interface Car { public void assemble(); }
注意,客户端程序可以在运行时创建不同种类的对象,并且它们也可以指定执行顺序。
以上测试程序的输出为:
package com.theitroad.design.decorator; public class BasicCar implements Car { @Override public void assemble() { System.out.print("Basic Car."); } }
装饰器设计模式-重点
装饰器设计模式有助于提供运行时修改功能,因此更加灵活。
选择数量更多时,它易于维护和扩展。装饰器设计模式的缺点是它使用许多类似的对象(装饰器)。
装饰器模式在Java IO类中使用很多,例如FileReader,BufferedReader等。