装饰者模式

假设现在有一块蛋糕,加上奶油就是奶油蛋糕,再加上巧克力就是巧克力奶油蛋糕,再要是加上水果,就是巧克力水果奶油蛋糕,当然我们也可以做水果奶油蛋糕。这就是装饰的过程。

几大roles

  • Componet (被装饰者接口/抽象类) 就是蛋糕的API
  • ConcreteComponent (具体的被装饰者) 具体蛋糕
  • Decorator (装饰者接口/抽象类) 同样继承/实现被装饰者 装饰物
  • ConcreteDecorator (具体装饰者) 由奶油/巧克力/水果...来扮演

UML图:
图片说明

优点

  • 接口(API)的透明性
    装饰物和装饰对象都继承了Component类,说明装饰物和装饰对象具有一致性,也就是即使被装饰过的装饰对象还能继续被装饰。就像剥洋葱一样,一层一层的皮就是装饰物,而尽管有很多层皮,它还是洋葱。
  • 在不改变装饰对象的前提下增加功能
    因为具有相同的API,所以我们可以递归装饰,比如蛋糕被奶油装饰过变成奶油蛋糕,巧克力再对奶油蛋糕进行装饰变成了巧克力奶油蛋糕,装饰越多,功能越多,而我们也不需要对被装饰的类进行任何的修改。

应用场景

java.io包中的类就运用到了装饰者模式。
比如,我们先生成一个读取文件的实例 Reader reader = new FileReader("datafile.txt");
我们也可以在读取文件时将文件内容放入缓冲区 Reader reader = new BufferedReader(new FileReader("datafile.txt"););