Head First Design Patterns - 装饰者模式

什么是装饰者模式

装饰者模式动态地将额外责任附加到对象上。对于拓展功能,装饰者提供子类化的弹性替代方案。 --《Head First Design Patterns》中的定义

为什么会有装饰者模式

根据上述定义,简单来说,装饰者模式就是对原有的类,增加一些额外的功能或者行为。用普通的继承或者组合也可以实现,但是单纯用继承或者组合来做,会产生大量的拓展类而导致"类爆炸"。

书中用咖啡的价格为例,说明了类爆炸这个概念:

咖啡店的咖啡的种类有4种,每种的价格不一样
在这里插入图片描述

若除了咖啡本身,还可以要求加上不同的调料,例如蒸奶(milk)、豆奶(soy)、摩卡(Mocha)。这样子,子类的拓展组合,就会有很多种,从而导致类爆炸,如下图所示。
在这里插入图片描述

装饰者模式的特点

  • 装饰者和被装饰者继承同一个基类。因为装饰者必须能够取代被装饰者,这里利用继承达到“类型匹配”,而不是利用继承获取“行为”
  • 装饰者拥有(has a)一个与被装饰者相同的基类类型属性(类似策略模式)
  • 可以用一个或多个装饰者类包装同一个对象
  • 装饰者可以在所委托被装饰者的行为之前或行为之后或行为之前与之后加上自己的行为,以达到特定的目的

装饰者模式的类图

在这里插入图片描述

例子

以上述咖啡店的咖啡价格为例子

  1. 基类:对应上图中的Component
public abstract class Beverage {String description = "Unknown Beverage";public String getDescription() {return description;}public abstract double cost();
}

2. 咖啡种类的拓展类: 对应上图中的ConcreteComponent

public class Espresso extends Beverage{public Espresso() {description = "Espresso";}@Overridepublic double cost() {return 1.99;}
}public class HouseBlend extends Beverage {public HouseBlend() {description = "HouseBlend";}@Overridepublic double cost() {return .89;}
}

3. 调料类

public class Mocha extends CondimentDecorator {public Mocha(Beverage beverage) {this.beverage = beverage;}@Overridepublic String getDescription() {return beverage.getDescription() + ", Mocha";}@Overridepublic double cost() {return beverage.cost() + .20;}
}public class Whip extends CondimentDecorator{public Whip(Beverage beverage) {this.beverage = beverage;}@Overridepublic String getDescription() {return beverage.getDescription() + ", whip";}@Overridepublic double cost() {return beverage.cost() + .10;}
}

4. 测试

public static void main(String[] args) {// 要一杯浓缩咖啡,不加调料Beverage beverage = new Espresso();System.out.println(beverage.getDescription() + " $" + beverage.cost());//要一杯HouseLand,带有2份mocha和whipBeverage beverage1 = new HouseBlend();beverage1 = new Mocha(beverage1);beverage1 = new Mocha(beverage1);beverage1 = new Whip(beverage1);System.out.println(beverage1.getDescription() + " $" + beverage1.cost());}

上述的咖啡喝调料可以在不改动基类代码的基础上,进行随意组合。

装饰者模式用到的设计原则

类应该对拓展开放,对修改关闭(开闭原则)

应用

java中的I/O流
在这里插入图片描述
参考:装饰者模式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/315427.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySql篇——MySql使用常见问题及解决办法

这里汇总MySql使用常见问题及解决办法,会持续更新。 问题1.ERROR 1819 (HY000): Your password does not satisfy the current policy requirements。 含义:你设置的密码不符合当前的密码等级。 可使用 SHOW VARIABLES LIKE validate_password%; 查看…

20个Laravel教程资源助你快速入门和进阶

Laravel多年来一直是PHP应用程序开发的摇滚明星,这是有充分理由的。庞大的生态系统、活跃的社区、强大的就业市场、成功的初创公司——它拥有一切让采用新技术变得值得的东西。 如果你想学习Laravel,你不需要更进一步。通过浏览本指南,您可以…

第四课:早期的编程方式、编程语言发展史、编程基础-语句和函数、算法入门、数据结构、阿兰图灵及软件工程

第四课:早期的编程方式、编程语言发展史、编程基础-语句和函数、算法入门、数据结构、阿兰图灵及软件工程 第十章:早期的编程方式1、早期,程序如何进入计算机2、早期计算机的编程3、现代计算机基础结构——冯诺依曼计算机 第十一章&#xff1…

HUAWEI华为荣耀MagicBook X 15酷睿i5-10210U处理器集显(BBR-WAH9)笔记本电脑原装出厂Windows10系统

链接:https://pan.baidu.com/s/1YVcnOP5YKfFOoLt0z706rg?pwdfwp0 提取码:fwp0 MagicBook荣耀原厂Win10系统自带所有驱动、出厂主题壁纸、系统属性专属LOGO标志、Office办公软件、华为/荣耀电脑管家等预装程序 文件格式:esd/wim/swm 安装…

【Git】git的分支管理

前言 本篇博客记录git的杀手级功能,分支管理。 所谓分支,可以简单理解为一个并发的过程,最终可以合并到一条线上。可以简单理解为相同的时间做了多份的事情,效率加倍。 其次,有了分支的存在,我们可以在对主…

OpenGL ES 如何直接渲染 P010、P016 格式图像?

未经作者(微信ID:Byte-Flow)允许,禁止转载 文章首发于公众号:字节流动 前面文章已经介绍过如何渲染 16bit 灰度图,本篇基于同样的思路来实现 P010、P016 格式图像的渲染。 P010 最早是微软定义的格式,表示的是 YUV 4:2:0 的采样方式,也就是说 P010 表示的是一类 YUV 格…

电子招标采购系统源码之从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理

​随着市场竞争的加剧和企业规模的扩大,招采管理逐渐成为企业核心竞争力的重要组成部分。为了提高招采工作的效率和质量,我们提出了一种基于电子化平台的解决方案。该方案旨在通过电子化招投标,使得招标采购的质量更高、速度更快,…

ORACLE Primavera Unifier v23.12 最新虚拟机(VM)分享下载

引言 根据上周的计划,我近日简单制作了一个基于ORACLE Primavera Unifier 最新版23.12的虚拟机演示环境,里面包括了unifier的全套系统服务 此虚拟系统环境仅用于演示、培训和测试目的。如要在生产环境中使用此虚拟机,请您与Oracle 销售代表联…

2024新版塔罗占卜网站源码风水起名附带搭建视频及文本教程

附带文本教学及视频教程安装方法以linux为例: 1、建议在服务器上面安装宝塔面板,以便操作,高逼格技术员可以忽略这步操作。 2、把安装包文件解压到根目录,同时建立数据库,把数据文件导入数据库 3、修改核心文件conf…

从零实现一套低代码(保姆级教程) --- 【12】实现左侧层级树并支持查看JSON

摘要 目前,我们还有最后一个小模块没有实现,那就是左侧的数据。 我们希望它能够展示整个页面的相关协议,其实也就是我们redux中管理的数据。我们希望能够通过可视化的方式看到它。 因为有时候我们想知道一个组件的具体信息,就可…

GPT-4在概念推理任务表现不如人类,还需继续学习提高!

圣达菲研究所的科研人员对 GPT-4在推理和抽象能力方面与人类的差距进行了定量研究。他们使用 ConceptARC 基准测试评估了 GPT-4在文本和多模态方面的表现,并发现 GPT-4仍然与人类存在较大差距。对于 GPT-4的抽象推理能力,研究人员发现,无论是…

vmware安装openEuler 22.03 LTS操作系统

vmware安装openEuler 22.03 LTS操作系统 1、下载openEuler操作系统镜像文件2、安装openEuler操作系统3、配置openEuler操作系统3.1、配置静态IP地址 和 dns3.2、查看磁盘分区3.3、查看系统版本 1、下载openEuler操作系统镜像文件 官网下载链接 链接: https://www.openeuler.or…