首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【设计模式-装饰者模式】

【设计模式-装饰者模式】

作者头像
Liusy
发布2020-09-01 16:23:33
2460
发布2020-09-01 16:23:33
举报
文章被收录于专栏:Liusy01Liusy01Liusy01

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

一、定义

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

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

二、实例

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

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

炒粉:

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里面涉及到的设计模式有装饰者模式。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-03-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Liusy01 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档