博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式之装饰模式
阅读量:5142 次
发布时间:2019-06-13

本文共 1857 字,大约阅读时间需要 6 分钟。

     《设计模式》一书对Decorator是这样描述的:
  动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式比生成子类更为灵活。

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

代码如下:

abstract class Component{abstract public void printTicket();}class SalesTicket extends Component{public void printTicket() { System.out.println("打印出salesTicket的内容");}}abstract class TicketDecorator extends Component{private Component myTrailer;public TicketDecorator(Component myComponent){ myTrailer=myComponent;}public void callTrailer(){ if(myTrailer!=null) myTrailer.printTicket();}}class Header extends TicketDecorator{public Header(Component myComponent){ super(myComponent);}public void printTicket(){ System.out.println("打印salesTicket的头信息"); super.callTrailer(); }}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模式的适用场合是,各种可选的功能在另一个肯定要执行的功能之前或之后执行。                                             (部分资料整理于网络)

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://www.cnblogs.com/lucari/p/4608581.html

你可能感兴趣的文章
如何开启safari的调试
查看>>
js深拷贝和浅拷贝
查看>>
node.js 基础学习笔记1
查看>>
如何在linux系统中设置静态ip地址
查看>>
二分查找法,折半查找原理
查看>>
DP简单问题联系--最长递增子序列+最长公共子序列等
查看>>
2017-4-18 Zabbix server的安装以及ansible批量部署zabbix agent的工作笔记
查看>>
GridView 动态列上方添加相应的Combox等控件
查看>>
申请开发者账号
查看>>
oracle启动
查看>>
c++模板学习
查看>>
【转】MySQL Event
查看>>
[转]html5监听任何App自带返回键javascript事件
查看>>
通俗理解LDA主题模型
查看>>
jzoj5813
查看>>
HttpServletRequest 获取URL的方法及区别
查看>>
VMware环境和Window环境进行网络连接的问题
查看>>
macOS10.12允许所有来源设置
查看>>
C++有关 const & 内敛 & 友元&静态成员那些事
查看>>
函数积累
查看>>