为何使用装饰者模式?java
好比说,咱们如今须要一杯奶茶,以后咱们还想往奶茶里加入珍珠,椰果。spa
可是若是直接修改奶茶的类,不符合咱们尽可能少修改原类的原则。设计
因此咱们须要一种不须要修改原类,就能够为原类增添新属性的方法。对象
什么是装饰者模式?继承
定义:动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。io
装饰模式是在没必要改变原类文件和使用继承的状况下,动态地扩展一个对象的功能。它是经过建立一个包装对象,也就是装饰来包裹真实的对象。扩展
设计原则:类应该对扩展开放,对修改关闭。程序
实现:方法
装饰者和被装饰者之间必须是同样的类型,也就是要有共同的父类。由于装饰者和被装饰者是同一个类型,所以装饰者能够取代被装饰者,这样就使被装饰者拥有了装饰者独有的行为。根据装饰者模式的理念,咱们能够在任什么时候候,实现新的装饰者增长新的行为。若是是用继承,每当须要增长新的行为时,就要修改原程序了。im
问题解决:
咱们可让奶茶和CondimentDecorator都有共同的父类Beverage,以后再由CondimentDecorator派生出珍珠、椰果等做料的子类。
若是咱们要加入珍珠,咱们能够直接将奶茶(或者已经添加了一些属性的奶茶)做为珍珠实例的一个属性,也即Decorateor中必有一个指向父类Beverage的属性。
也正由于奶茶和佐料都用共同的父类,因此佐料实例能够直接取代奶茶实例。
应用如:输入输出流的一层层包装
java.io.BufferedReader; java.io.FileReader; java.io.Reader;