定义:
装饰器(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。
你自己做了一杯咖啡觉得太苦了,于是你想加点糖。
/** * 定义一个咖啡的接口 */interface Coffee{ /** * 打印里面有什么 */ void printMaterial();}/** * 来一杯苦咖啡 */class BitterCoffee implements Coffee{ public void printMaterial() { System.out.println("苦咖啡!"); }}/** * 你喝了一口咖啡有点苦,来点糖 */class CoffeeDecorator implements Coffee{ /** * 持有一个咖啡的对象 */ private Coffee coffee; public CoffeeDecorator(Coffee coffee){ this.coffee=coffee; } public void printMaterial() { coffee.printMaterial(); System.out.println("加点糖"); }}public class Decorator { public static void main(String[] args) { //来一杯苦咖啡 Coffee coffee=new BitterCoffee(); //加点糖 coffee=new CoffeeDecorator(coffee); coffee.printMaterial(); }}
装饰者模式与代理模式区别:
这里注意与代理模式的区别,如果是代理模式的话就会变成如下:
一个朋友来你家,你给她做了一杯咖啡,你知道咖啡很苦决定给咖啡加了点糖。
class CoffeeProxy implements Coffee{ private final Coffee coffee; public CoffeeProxy() { coffee=new BitterCoffee(); } public void printMaterial() { this.coffee.printMaterial(); System.out.println("我觉得这个会很苦,主动加点糖"); }}class Proxy{ public static void main(String[] args) { Coffee coffee=new CoffeeProxy(); coffee.printMaterial(); }}
源码举例:
注意:jdk版本不同会继承的类不同哦。
使用场景:
①、装饰器模式就是使用在对已有的目标功能存在不足,需要增强时,前提是目标存在抽象接口。
②、当不能采用继承的方式对系统进行扩展或者采用继承不利于系统扩展和维护时可以使用装饰模式。不能采用继承的情况主要有两类: 第一类是系统中存在大量独立的扩展,为支持每一种扩展或者扩展之间的组合将产生大量的子类,使得子类数目呈爆炸性增长;第二类是因为类已定义为不能被继承(如Java语言中的final类)。