一.概念
动态的给一个对象添加额外的职责。想要扩展功能的话,装饰者提供了一种有别于继承的另外一种选择。
二.UML
- Component(概念中提到的对象接口),也就是“被装饰者”。
- ConcreateComponent(未添加任何职责的,对象接口的子类)。
- Decorator(装饰者抽象类),扩张了对象接口的功能。
- ConcreteDrcorator(具体装饰类),具体怎么装饰对象接口的在这些类里面反映。
三.实例分析
家里买了一套房子,需要装修,考虑到预算只有这么多,不能采用全包的方式,于是采用将装修工作细化,以节省开销。
House
- package com.zzy.decorator;
- /**
- * 被装修者-房子
- * @author eason
- *
- */
- public interface House {
- public void decorate();
- }
BlankHouse
- package com.zzy.decorator;
- /**
- * 未经装修的房子
- * @author eason
- *
- */
- public class BlankHouse implements House{
- @Override
- public void decorate() {
- System.out.println("未经装修的房子");
- }
- }
Decorator
- package com.zzy.decorator;
- /**
- * 装修工抽象类
- * @author eason
- *
- */
- public class Decorator implements House{
- private House house;
- public Decorator(House house) {
- this.house = house;
- }
- @Override
- public void decorate() {
- house.decorate();
- }
- }
ElectricWirer
- package com.zzy.decorator;
- /**
- * 电线工
- * @author eason
- *
- */
- public class ElectricWirer extends Decorator {
- public ElectricWirer(House house) {
- super(house);
- }
- @Override
- public void decorate() {
- super.decorate();
- //自己的逻辑-具体怎么包装的写在super.decorate()的前后任何地方
- System.out.println("已经装修完电线");
- }
- }
Floorer
- package com.zzy.decorator;
- /**
- * 地板工
- * @author eason
- *
- */
- public class Floorer extends Decorator {
- public Floorer(House house) {
- super(house);
- }
- @Override
- public void decorate() {
- super.decorate();
- //自己的逻辑-具体怎么包装的写在super.decorate()的前后任何地方
- System.out.println("已经装修完地板");
- }
- }
WaterPiper
- package com.zzy.decorator;
- /**
- * 水管工
- * @author eason
- *
- */
- public class WaterPiper extends Decorator {
- public WaterPiper(House house) {
- super(house);
- }
- @Override
- public void decorate() {
- super.decorate();
- //自己的逻辑-具体怎么包装的写在super.decorate()的前后任何地方
- System.out.println("已经装修完水管");
- }
- }
TestDecorator
- package com.zzy.decorator;
- /**
- * 测试类
- * @author eason
- *
- */
- public class TestDecorator {
- public static void main(String[] args) {
- //空白房子一个
- House house = new BlankHouse();
- //一层层装修
- Decorator dec = new Floorer(new ElectricWirer(new WaterPiper(house)));
- dec.decorate();
- }
- }
四.使用场景
- 为已有组件动态添加更多功能。
五.使用感受
- 将装饰功能的代码从Component里面提了出来,简化了Component。
- 客户端可以在运行时根据需要,选择需要的功能来包装Component。
- 继承是扩展功能的方式之一,但并不见得是达到弹性设计的最佳形方式。
- 组合和委托可用于在运行时动态地加上新的行为。装饰者模式实际上就是组合和委托。再次提到组合和委托,第一次提到是在策略模式 里面。
- 在日常的设计中,应该允许行为被扩展,而不需修改现有的代码。
- 装修者会导致设计中出现许多小对象,如果过度使用,会让程序变的复杂。
相关推荐
### ZY3-01星SC产品命名规范详解 #### 一、前期数据命名规则解析 根据提供的信息,我们可以了解到ZY3-01星SC产品的前期数据命名规则如下: **Zy3_01a_mynnavp_PPPRRR_YYYYMMDD_hhmmss_tttt_sasmac_chn_xxx_zzz_##...
ZY08-C的综合程序可能采用模块化设计,包括循迹模块、避障模块和遥控模块,每个模块独立运行且可以互相协作。主循环负责协调各个子系统的操作,确保它们在不同场景下无缝切换。此外,程序还可能包含故障诊断和恢复...
这个名为"ZY08-C循迹、红外避障、遥控综合程序.rar"的压缩包包含了实现这些功能所需的所有软件资源,特别是对于51单片机这种广泛应用的微控制器而言,这样的设计展示了其在自动化和远程控制领域的潜力。 首先,让...
总的来说,ZY08-C循迹寻黑线程序是一个集成了硬件感知、软件控制和智能算法的综合项目,它展示了单片机在自动化控制领域的应用,对于学习单片机编程、智能小车设计以及传感器应用的人来说,是一个很好的实践案例。
《RF-CZ-ZY-03 供应商入围及评估管理作业指引》是针对企业在供应链管理中的一个重要环节——供应商选择与评估的规范性文档。在现代商业环境中,供应商管理是企业运营的关键部分,它直接影响到产品质量、成本控制和...
"RF-CB-ZY-03-F03 设计变更估算汇总表"是一个可能用于记录和管理这些变更的重要文档,通常以电子表格的形式存在,如本例中的".xls"文件。下面我们将深入探讨这个主题,了解设计变更估算汇总表的关键组成部分和作用。...
《RF-CB-ZY-04 工程结算及复核作业指引》是针对建筑工程行业中的一项重要流程,旨在规范工程项目的结算与复核工作,确保财务数据的准确性和工程项目的顺利完成。这一作业指引通常包含一系列详细的操作步骤、规定以及...
《住宅方案评审检查表-给排水》是针对住宅建设中给排水系统设计的重要评估工具,主要目的是确保住宅项目的给排水方案符合国家规范、行业标准以及项目自身的需求,从而保证居民的生活用水安全和环境质量。这份文档...
【RF-GC-ZY-08-F06 材料进场验收单】是建筑行业中一个重要的文档,主要用于记录和管理施工现场材料的接收和检验过程。这个文档通常由项目管理团队或质量控制部门填写,确保所有进场的建筑材料符合工程设计、质量和...
"9.ZY08-C智能小车配套例程代码.zip"是一个压缩包文件,包含了为这种特定型号智能小车设计的功能程序和相关的注释。这些代码是实现小车智能化运作的关键,通过分析和理解这些代码,我们可以深入学习智能小车的工作...
"RF-YX-ZY-05-F05 销售代理服务供方甄选评分表(1).zip" 文件提供了一个评估和选择销售代理的标准化工具。以下是基于该文件名和描述可能涉及的相关知识点: 1. **评分表**:评分表是一种评估工具,用于量化和系统化...
比例项对应当前误差,积分项考虑过去的误差,微分项预测未来的误差趋势,三者结合可以实现快速且稳定的响应。 4. 单片机编程:ZY08-C程序很可能是用C语言编写,运行在单片机上,如Arduino或STM32等。单片机负责处理...
这个名为"RF-KF-ZY-02-F07 维修验收记录表(1).zip"的压缩包文件,显然包含了针对某一特定设备或系统维修后进行验收过程的详细记录。以下是关于维修验收记录表的一些关键知识点: 1. **维修验收的目的**:维修验收的...
"RF-YX-ZY-06 销售总结编写作业指引.zip"是一个压缩包文件,其中包含的"RF-YX-ZY-06 销售总结编写作业指引.doc"文档,很显然是一个指导如何有效编写销售总结的详细指南。以下将深入探讨销售总结的主要内容、重要性...
"RF-KF-ZY-02-F03 工程保修协议书(1).zip" 是一个包含工程保修协议书的压缩文件,它可能涉及到建筑、软件开发或者系统集成等领域的工程项目。在这样的文件中,通常会规定承包商对工程的质量保证、保修期限、责任范围...
"RF-CB-ZY-01-F01 目标成本测算表"很可能是一个用于计算和规划产品或服务预期成本的电子表格工具,如Excel文件"RF-CB-ZY-01-F01 目标成本测算表.xls"所示。 首先,目标成本是指企业为了实现特定利润目标,计划产品...
《RF-YX-ZY-07 顾客要求及设计工程变更管理工作指引》是针对产品开发过程中,如何有效地处理顾客需求和设计变更的一项重要文档。在IT行业中,尤其是软件开发和工程设计领域,理解和管理顾客需求以及应对设计变更至关...
ZY1730是一款专为在恶劣环境中稳定工作的语音芯片设计的产品。该芯片适用于多种应用场景,尤其是在公共交通领域如地铁、公交车等城市公共设施中表现优异。其设计考虑到了在复杂环境下的稳定性和可靠性,确保了即使在...
【ZY Music! v1.1.1 源码解析】 ZY Music! v1.1.1 是一个商业级别的音乐播放应用的源码版本,它提供了丰富的音乐播放功能,并且可能包含了一些针对商业环境优化的设计。这个源码是开发者学习和理解音乐应用开发的...