一、模式名
装饰者模式, Decorator
二、解决的问题
装饰者模式顾名思义,就是在原来的对象上加入一些修饰的部分,用以丰富原有对象的功能。但装饰器模式中的装饰器类和被装饰的对象保持一致,一般是继承或实现同一个父类或接口。
三、解决方案
装饰者模式的UML图如下所示。
示例代码如下
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