千家信息网

“Head First 设计模式“ :装饰模式

发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,装饰模式装饰者模式:动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。装修模式的角色如下:抽象构件角色(Component):给出一个抽象接口,以规范准备接收附加责任的对象
千家信息网最后更新 2026年11月04日“Head First 设计模式“ :装饰模式

装饰模式


装饰者模式:动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。

装修模式的角色如下:

    • 抽象构件角色(Component):给出一个抽象接口,以规范准备接收附加责任的对象。

    • 具体构件角色(Concrete Component):定义将要接收附加责任的类。

    • 装饰角色(Decorator):持有一个构件(Component)对象的引用,并定义一个与抽象构件接口一致的接口。

    • 具体装饰角色(Concrete Decorator):负责给构件对象"贴上"附加的责任。类图如下:

装修模式的特点:

    • 装饰对象和真实对象有相同的接口。这样客户端对象就可以以和真实对象相同的方式和装饰对象交互。

    • 装饰对象包含一个真实对象的引用(reference)。

    • 装饰对象接收所有来自客户端的请求,它把这些请求转发给真实的对象。

    • 装饰对象可以在转发这些请求之前或之后附加一些功能。

    • 这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。


装修模式的缺点:

    • 装饰模式会导致设计中出现许多小类,如果过度使用,会使程序变得很复杂。

    • 装饰模式是针对抽象组件(Component)类型编程。但是,如果你要针对具体组件编程时,就应该重新思考你的应用架构,以及装饰者是否合适。当然也可以改变Component接口,增加新的公开的行为,实现"半透明"的装饰者模式。在实际项目中要做出较佳选择。

装饰模式的使用场景:

    • 适合对默认目标实现中的多个接口进行排列组合调度

    • 适合对默认目标实现进行选择性扩展

    • 适合对默认目标实现未知或者不易扩展的情况。


实例1:咖啡店有好几种咖啡,每一种都是自己的价格,成分等,类图如下;

问题的产生:咖啡可以放些糖等调料,调料种类多,新增了N个子类来对应咖啡,价格,调料之间的关系,后期维护有了很大的挑战,类图如下:

解决:我们可以用装饰模式来解决,最终的类图如下:

实例2:扩展JAVA里的I/O,读取文件里的数据,并转成大写字母输出

分析:JDK里I/O框架用到了适配器模式,类图如下:

说明:抽象构建角色(InputStream),装饰角色(FilterInputStream),具体装饰(BufferdInputStream等),具体构建角色(FileInputStream等)

实现:我们看类图,我们继承FilterInputStream,覆盖掉read方法就能满足这个需求了。


设计原则:类应该对扩展开放,对修改关闭。


对象 模式 角色 接口 附加 构件 咖啡 责任 功能 目标 调料 设计 相同 价格 实例 客户 组件 编程 选择 合适 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 科技互联网 广东万易互联网科技有限公司惠州分公司 广州百单互联网科技有限公司 互联网的科技 互联网科技缩写 掌上梦互联网科技 互联网科技博主是什么意思 随着互联网科技发展 千方科技属于互联网企业吗 湖南一路畅行互联网科技 深圳市优智互联网科技有限公司 互联网科技扶贫时间 科技类公司包括互联网吗 无锡工业互联网科技有限公司 浙南科技城互联网大厦招聘 厦门江牛科技互联网 扫呗互联网科技有限公司 悟空问答互联网科技 互联网领先科技成果宣传视频 科技互联网企业在行动 亿人帮互联网科技有限公司 互联网科技股票 玖二柒互联网科技公司待遇 江苏南京365互联网科技 广州慧亚互联网科技怎么样 重庆威客帮互联网科技 长沙渺峰互联网科技有限公司 互联网科技职业技能培训学校 众联互联网络科技 株洲百竞科技的互联网营销顾问
0