装饰器模式

一、模式名

装饰者模式, Decorator

二、解决的问题

装饰者模式顾名思义,就是在原来的对象上加入一些修饰的部分,用以丰富原有对象的功能。但装饰器模式中的装饰器类和被装饰的对象保持一致,一般是继承或实现同一个父类或接口。

三、解决方案

装饰者模式的UML图如下所示。

clipboard

示例代码如下

public class DecoratorExer {
   public static void main(String[] args) throws Exception {
      House apartment = new Apartment();
      Decorator europeStyle = new EuropeStyle(apartment);

      apartment.show();
      europeStyle.show();
   }
}

abstract class House {
   abstract String getFacade();
   abstract String getBase();
   void show() {
      System.out.println(getFacade() + getBase());
   }
}

class Apartment extends House {
   @Override
   String getFacade() {
      return "外立面";
   }

   @Override
   String getBase() {
      return "楼房";
   }
}

abstract class Decorator extends House {
   House house;

   public Decorator(House house) {
      this.house = house;
   }
}

class EuropeStyle extends Decorator {
   public EuropeStyle(House house) {
      super(house);
   }

   @Override
   String getFacade() {
      return "淡黄色的" + house.getFacade();
   }

   @Override
   String getBase() {
      return "10层的" + house.getBase();
   }
}

可以看到,定义了House抽象类,还有Decorator抽象类,其中Decorator继承于House,并且分别定义了House和Decorator的实现类。通过传入被装饰的对象,生成具体的装饰对象,使用该装饰对象完成后续操作。

常用场景:

1. 最经典的使用装饰器模式的是Jdk中的io操作,比如BufferedReader和FileReader

原文地址:https://www.cnblogs.com/glsy/p/11073509.html