设计模式之装饰者模式
【导读】在很多场景中,已有核心组件,此时需要对组件的功能进行扩展,此时就需要用到装饰者模式,例如建房子,核心组件就类似于房屋的架构,想要进行装修,就得聘请装修团队。
一、定义
在不改变原有对象的基础之上,将功能附加到对象上,也就是说是继承的补充,接口与接口之前是有层次关系的。
也就是说新增功能需要创建另外一个对象,此对象功能实现需要依赖原有对象的功能。
二、实例
还在读大学的时候,每次从健身房出来就会买一个炒粉,有时会加一个鸡蛋,有时会加一根香肠,加上小米辣,别提多想了,怀念!
此时炒粉就是一个架构,鸡蛋、香肠、小米辣等只是在炒粉的基础上进行修饰。那么炒粉就是被修饰者,鸡蛋等就是修饰者。
炒粉:
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 = new EggDecorator(abstractFireNoodle);
abstractFireNoodle = new EggDecorator(abstractFireNoodle);
System.out.println(abstractFireNoodle.desc());
System.out.println(abstractFireNoodle.price());
结果:
下面是几个类的类图
三、源码实例
FilterInputStream和InputStream
FilterInputStream的方法基本都是基于InputStream的,例如read方法。
也就是说IO里面涉及到的设计模式有装饰者模式。
=======================================================
我是Liusy,一个喜欢健身的程序员。
欢迎关注微信公众号【Liusy01】,一起交流Java技术及健身,获取更多干货,领取Java进阶干货,一起成为Java大神。
来都来了,关注一波再溜呗。