Java中的装饰器设计模式示例

时间:2020-02-23 14:36:12  来源:igfitidea点击:

装饰器设计模式用于在运行时修改对象的功能。
同时,同一类的其他实例将不受此影响,因此单个对象将获得修改后的行为。
装饰器设计模式是结构设计模式之一(例如适配器模式,桥接器模式,复合模式),并使用抽象类或者具有组成部分的接口来实现。

装饰设计模式

我们使用继承或者组合来扩展对象的行为,但这是在编译时完成的,并且适用于该类的所有实例。
我们无法添加任何新功能来删除运行时的任何现有行为-这是装饰器模式出现的时候。

假设我们要实现不同类型的汽车-我们可以创建接口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等。