【导读】在很多场景中,已有核心组件,此时需要对组件的功能进行扩展,此时就需要用到装饰者模式,例如建房子,核心组件就类似于房屋的架构,想要进行装修,就得聘请装修团队。
一、定义
在不改变原有对象的基础之上,将功能附加到对象上,也就是说是继承的补充,接口与接口之前是有层次关系的。
也就是说新增功能需要创建另外一个对象,此对象功能实现需要依赖原有对象的功能。
二、实例
还在读大学的时候,每次从健身房出来就会买一个炒粉,有时会加一个鸡蛋,有时会加一根香肠,加上小米辣,别提多想了,怀念!
此时炒粉就是一个架构,鸡蛋、香肠、小米辣等只是在炒粉的基础上进行修饰。那么炒粉就是被修饰者,鸡蛋等就是修饰者。
炒粉:
1、炒粉的抽象对象public abstract class AbstractFireNoodle { 描述 public String desc(){ return "这是一个炒粉"; } 价格 public int price(){ return 8; }}2、实际的炒粉对象 public class FireNoodle extends AbstractFireNoodle { @Override public String desc() { return super.desc(); } @Override public int price() { return super.price(); }}
装饰者类:
1、鸡蛋装饰者,继承了抽象炒粉类public class EggDecorator extends AbstractFireNoodle{ 2、还包含了一个炒粉对象 private AbstractFireNoodle abstractFireNoodle; public EggDecorator(AbstractFireNoodle abstractFireNoodle) { this.abstractFireNoodle = abstractFireNoodle; } 3、在炒粉描述的基础上去添加描述 @Override public String desc() { return this.abstractFireNoodle.desc()+" 加一个鸡蛋"; } 4、在炒粉价格的基础上去增加 @Override public int price() { return this.abstractFireNoodle.price() + 1; }}
从上述代码可知,装饰者类都是基于被装饰者类的功能上进行改造,装饰者和被装饰者是有层次关系的。
测试类:
AbstractFireNoodle abstractFireNoodle = new FireNoodle();abstractFireNoodle = newEggDecorator(abstractFireNoodle);abstractFireNoodle = newEggDecorator(abstractFireNoodle);System.out.println(abstractFireNoodle.desc());System.out.println(abstractFireNoodle.price());
结果:
下面是几个类的类图
三、源码实例
FilterInputStream和InputStream
FilterInputStream的方法基本都是基于InputStream的,例如read方法。
也就是说IO里面涉及到的设计模式有装饰者模式。