《设计模式》一书对Decorator是这样描述的:
 动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式比生成子类更为灵活。
也就是说:动态地给对象添加一些额外的功能。它的工作原理是:创建一个始于Decorator对象(负责新功能的对象)终止于原对象的一个对象的“链”。例如,我们要为超市的收银台设计一个打印票据的程序,有的需要打印票据的头信息,有的需要打印票据的页脚信息,有的只需要打印票据的内容。如果针对每一种情况都修改一次程序,势必会很麻烦。这时我们可以考虑使用Decorator模式。其结构类图如下:

abstract public class Component { abstract public void printTicket(); } public class SalesTicket extends Component { public void printTicket() { System.out.println("打印出salesTicket的内容"); } } public abstract class TicketDecorator extends Component { private Component myTrailer; public TicketDecorator(Component myComponent) { myTrailer = myComponent; } public void callTrailer() { if (myTrailer != null) myTrailer.printTicket(); } } public class Header extends TicketDecorator { public Header(Component myComponent) { super(myComponent); } public void printTicket() { System.out.println("打印salesTicket的头信息"); super.callTrailer(); } } public class Footer extends TicketDecorator { public Footer(Component myComponent) { super(myComponent); } public void printTicket() { super.callTrailer(); System.out.println("打印salesTicket的页脚信息"); } } public class Client { public static void main(String[] args) { System.out.println("===================================="); new Header(new Footer(new SalesTicket())).printTicket(); System.out.println("===================================="); new Footer(new Header(new SalesTicket())).printTicket(); System.out.println("===================================="); } }

输出结果:
====================================
打印salesTicket的头信息
打印出salesTicket的内容
打印salesTicket的页脚信息
====================================
打印salesTicket的头信息
打印出salesTicket的内容
打印salesTicket的页脚信息
====================================

从这个例子我们可以看出,Decorator模式把问题分为两部分:
1) 如何实现提供新功能的对象。
2) 如何为每种特殊情况组织对象。
这样能够将Decorator对象的实现与决定如何使用Decorator的对象分离开来,从而提高了内聚性,因为每个Decorator对象只用关心自己添加的功能,无需关心自己是如何被加入到对象链中。还可以任意地重排Decorator的顺序,无需改变其任何代码。
小结:Decorator模式的适用场合是,各种可选的功能在另一个肯定要执行的功能之前或之后执行。

设计模式之(九)--包装模式(decorator)相关推荐

  1. Java设计模式 Design Pattern:包装模式 Decorator Pattern

    意图 Attach additional responsibilities to an object dynamically. 为一个对象动态的添加职责. Decorators provide a f ...

  2. python中的装饰器、装饰器模式_python 设计模式之装饰器模式 Decorator Pattern

    #写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...

  3. python 设计模式之装饰器模式 Decorator Pattern

    #写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...

  4. 设计模式系列《包装模式》

    包装模式(修饰器模式) ​ 对象增强的方式 继承 继承父类,子类扩展 装饰器模式 使用"包装"的方式来增强对象 代理模式 代理模式 或者看我代理模式的笔记. 继承 ​ 最简单的方式 ...

  5. Java进阶篇设计模式之九----- 解释器模式和迭代器模式

    前言 在上一篇中我们学习了行为型模式的责任链模式(Chain of Responsibility Pattern)和命令模式(Command Pattern).本篇则来学习下行为型模式的两个模式, 解 ...

  6. 设计模式之装饰者模式Decorator

    装饰者模式,动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更加有弹性的替代方案 结构说明 1.Component抽象组件,是一个接口或者是抽象类,就是定义我们最核心的对象,也就是最原始的对 ...

  7. java设计模式之九外观模式(Facade)

    外观模式是为了解决类与类之家的依赖关系的,像spring一样,可以将类和类之间的关系配置到配置文件中,而外观模式就是将他们的关系放在一个Facade类中,降低了类类之间的耦合度,该模式中没有涉及到接口 ...

  8. php 命令设计模式示例,php设计模式(十九)命令模式-Fun言

    命令模式就和名字一样: 比较适合执行命令的场景: 命令发送者只管调用具体命令类中的 execute() 方法: 然后在具体命令类中设定命令接收者: 可以消除命令发送者和命令接受者之间的耦合: 并且可以 ...

  9. 设计模式之九原型模式

    问题描述 在开发中你也许遇到过大篇幅的使用get或set赋值的场景,例如: public void setParam(ExamPaperVo vo){ExamPaper examPaper = new ...

最新文章

  1. 2021年大数据常用语言Scala(八):基础语法学习 循环
  2. 如何通过网站SEO诊断来做竞争对手的分析?
  3. Entity Framework Core 2.0的突破性变更
  4. 判断两条线段是否相交
  5. 前端学习(1955)vue之电商管理系统电商系统之完成添加分类功能
  6. 白话debounce和throttle
  7. JAVA SAX解析XML文档
  8. Springmvc+mybatis配置前台页面传递JSON串给后台接收。
  9. Oracle 数据库管理脚本 命名规范
  10. 2022考研复习第二十三周
  11. dos 教程(很全的)
  12. AUTOSAR如何实现CAN Bus Off恢复的功能?
  13. 中小企业生产信息化:私有系统还是云方案?
  14. 【PS功能学习】10:蒙版带你领略台前幕后的故事
  15. How to become a hacker 译文(如何成为一名黑客)
  16. Python实现VRP常见求解算法——蚁群算法(ACO)
  17. jsp mysql购物网站a_海来福家具商品交易购物网站的设计(JSP,MySQL)(附答辩记录)
  18. 华为视频会议终端9039s开机自动入会
  19. php代码编辑软件安卓,PHP代码编辑软件|Rapid PHP编辑器 v15.0 最新版
  20. 七夕一键生成表白墙源码

热门文章

  1. java电影院购票系统概况_电影院售票管理系统
  2. 夜神模拟器+Fiddler抓包测试App
  3. 三维可视化引擎让空间数据管理更高效
  4. 计算机教师专业环境,信息技术环境对教师专业发展的新要求
  5. 计算机excel还原,『怎么还原电脑自带的excle』excel表格保存过了怎么恢复原来的数据...
  6. 案例分享 | 某券商利用AI技术进行告警关联分析(上)
  7. 零基础小白如何学习角色建模?这些流程步骤你一定要知道!
  8. 在纽约寻找童真——新泽西州乐高乐园探索中心的美好一天
  9. 微星 MSI GF63 i5-8300H+8G+128G+UHD630 基本完美黑苹果,把EFI分享给各位(2021.8.11 更新)
  10. 面试过程中如何介绍自己?最大优缺点?加班?薪资?