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

装饰器设计模式 用于在运行时修改对象的功能。同时,同一个类的其他实例不会受到影响,因此单个对象获得修改后的行为。装饰器设计模式是结构化设计模式的一种(例如[适配器模式](/community/tutorials/adapter-design-pattern-java)、[桥接模式](/community/tutorials/bridge-design-pattern-java),[复合图案](/community/tutorials/composite-design-pattern-in-java))并使用抽象类或接口与[composition](/community/tutorials/composition-in-java-example)来实现。

装饰器设计模式

我们使用inheritance或组合来扩展对象的行为,但这是在编译时完成的,它适用于类的所有实例。我们不能在运行时添加任何删除任何现有行为的新功能--这是Decorator模式出现的时候。假设我们要实现不同类型的汽车--我们可以创建接口汽车来定义装配方法,然后我们就可以拥有一辆基本车,而且我们可以将其扩展到跑车和豪华车。实现层次结构如下图所示。装饰模式,装饰设计模式,装饰模式java但如果我们想在运行时获得一辆同时具有跑车和豪华车功能的汽车,那么实现就会变得复杂,如果我们想进一步指定应该首先添加哪些功能,它就会变得更加复杂。现在想象一下,如果我们有十种不同的汽车,使用继承和组合的实现逻辑将无法管理。为了解决这种编程情况,我们在Java中应用了装饰者模式。我们需要有以下类型来实现装饰器设计模式。

1.组件接口 -定义要实现的方法的接口或** 抽象class** 。在我们的例子中,car将是组件接口。

1Com.Journal aldev.sign.decorator程序包;
2
3公共接口汽车{
4
5公共无效集合(PUBLIC VALID ASSEMBLE);
6}

2.组件实现 -组件接口的基本实现。我们可以使用BasicCar类作为组件实现。

 1Com.Journal aldev.sign.decorator程序包;
 2
 3公共类BasicCar实现了Car{
 4
 5@Override
 6PUBLIC VID ASSEMBLE(){
 7System.out.print();
 8}
 9
10}

3.Decorator -Decorator类实现Component接口,与Component接口具有-A关系。组件变量应该可以对子修饰器类进行访问,因此我们将使该变量受到保护。

 1Com.Journal aldev.sign.decorator程序包;
 2
 3公共类CarDecorator实现Car{
 4
 5保护车厢;
 6
 7公共CarDecorator(Car C){
 8This.car=c;
 9}
10
11@Override
12PUBLIC VID ASSEMBLE(){
13This.car.assemble();
14}
15
16}

4.混凝土装饰器 -扩展基础装饰器功能,并相应地修改组件行为。具体的装饰类可以有LuxuryCarSportsCar

 1Com.Journal aldev.sign.decorator程序包;
 2
 3公共类SportsCar扩展CarDecorator{
 4
 5公共运动车(汽车c){
 6超级(Super);
 7}
 8
 9@Override
10PUBLIC VID ASSEMBLE(){
11Super.assemble();
12System.out.print();
13}
14}
15`
16Com.Journal aldev.sign.decorator程序包;
17
18公共类LuxuryCar扩展CarDecorator{
19
20公共豪华汽车(Car C){
21超级(Super);
22}
23
24@Override
25PUBLIC VID ASSEMBLE(){
26Super.assemble();
27System.out.print();
28}
29}

Decorator设计模式-类图

装饰器设计模式,java中的装饰器设计模式

装饰器设计模式测试方案

 1package com.journaldev.design.test;
 2
 3import com.journaldev.design.decorator.BasicCar;
 4import com.journaldev.design.decorator.Car;
 5import com.journaldev.design.decorator.LuxuryCar;
 6import com.journaldev.design.decorator.SportsCar;
 7
 8public class DecoratorPatternTest {
 9
10    public static void main(String[] args) {
11    	Car sportsCar = new SportsCar(new BasicCar());
12    	sportsCar.assemble();
13    	System.out.println("\n*****");
14    	
15    	Car sportsLuxuryCar = new SportsCar(new LuxuryCar(new BasicCar()));
16    	sportsLuxuryCar.assemble();
17    }
18
19}

请注意,客户端程序可以在运行时创建不同类型的对象,并且它们还可以指定执行顺序。上述测试程序的输出为:

1Basic Car. Adding features of Sports Car.
2*****
3Basic Car. Adding features of Luxury Car. Adding features of Sports Car.

装饰者设计模式--要点

  • Decorator设计模式有助于提供运行时修改能力,因此更加灵活。当选择的数量更多时,它很容易维护和扩展。
  • 装饰者设计模式的缺点是它使用了大量类似的对象(装饰者)。
  • Decorator模式在Java IO类中大量使用,如FileReader、BufferedReader等。
Published At
Categories with 技术
comments powered by Disqus