设计模式之装饰者模式

【导读】在很多场景中,已有核心组件,此时需要对组件的功能进行扩展,此时就需要用到装饰者模式,例如建房子,核心组件就类似于房屋的架构,想要进行装修,就得聘请装修团队。

一、定义

在不改变原有对象的基础之上,将功能附加到对象上,也就是说是继承的补充,接口与接口之前是有层次关系的。

也就是说新增功能需要创建另外一个对象,此对象功能实现需要依赖原有对象的功能。

二、实例

还在读大学的时候,每次从健身房出来就会买一个炒粉,有时会加一个鸡蛋,有时会加一根香肠,加上小米辣,别提多想了,怀念!

此时炒粉就是一个架构,鸡蛋、香肠、小米辣等只是在炒粉的基础上进行修饰。那么炒粉就是被修饰者,鸡蛋等就是修饰者。

炒粉:

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大神。

来都来了,关注一波再溜呗。

posted @ 2020-10-30 23:14  上古伪神  阅读(80)  评论(0编辑  收藏  举报