看了阎宏的java与模式一书,说Decorator模式可以动态地给一个对象增加功能,并可动态的撤销,这一点是如何体现出来的?

difficult 2003-07-31 10:37:39
第26章Decorator模式部分,发票系统这个范例中,对打印发票头部和发票尾部用Decorator模式,我觉得并没有体现出有什么好处,如对发票头部和发票尾部分别用两个类来实现,这样系统还简单一些,且思路清晰。
欢迎大家一起讨论?
...全文
16 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuty2006 2003-08-07
  • 打赏
  • 举报
回复
up
armorking2003 2003-08-06
  • 打赏
  • 举报
回复
例子未必一定是足够贴切的
本来解决问题的方法就不应当只有一种
能够说明用意就是好的
myvoice 2003-08-04
  • 打赏
  • 举报
回复
楼上的兄弟解释的好,强
jigsaw 2003-08-04
  • 打赏
  • 举报
回复
myvoice(阿呆) :

拜托 你楼上的就是那本书的作者
jeffyan77 2003-08-03
  • 打赏
  • 举报
回复
好比你有一个一个的列车车厢,每一个车厢都有对运输功能作一些增强,然后你选取一些这样的车厢,连接起来,形成一个专列,这个专列的功能是组成它的那些车厢的功能的叠加。

这一次你这样叠加,下一次你可以用另一种排列组合进行叠加,从而得到不同的专列,代表不同的功能组合。

如果你有10个这样的车厢,原则上可以有10! = 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 种功能组合。如果不是用装饰模式,那么完全重复出这些组合就需要10! = 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 个类。这是不可想象的。

一个典型的装饰模式的应用就是 JAVA IO库包。在这个IO库包中,你需要下面这些功能
输入:
1、可缓存的输入
2、从文件的输入
3、可PUSH BACK 式的输入
4、带行号的输入
等等
问题是这些功能需要任意排列组合,比如我可能需要需要读入Java源代码文件,这样的话我就需要以下的功能组和:1 * 2 * 3 * 4 也就是从文件中读入,可以缓存,可以回读、知道行号。

我也有可能需要其他的组合。但是仅仅这四个功能,就会产生 4! = 4 * 3 * 2 * 1 = 24种功能组合。显然,这不是全部。如果你看看Java IO库包的话,不难认识到,可能需要的功能组和会成千上万。

如果不是采取这种列车车厢方式的设计,那么Java IO库包就会有成千上万种类,提供各种不同的组合功能。不可想象。

在23种经典的设计模式中,只有装饰模式具有这种排列组合设计。




mechgoukiteng 2003-08-01
  • 打赏
  • 举报
回复
动态改变的是外在行为

通过共同的接口来改变,Decorator的核心是动态改变对象,而不是类
difficult 2003-08-01
  • 打赏
  • 举报
回复
可以动态的改变什么?如何动态的改变?
ynnwq 2003-08-01
  • 打赏
  • 举报
回复
就是在你的类中封装你要改变的类,然后,在哪个类的方法前后加入一些功能。
建议你去看看jdon的设计模式教程
super_zzw 2003-08-01
  • 打赏
  • 举报
回复
可以这么考虑: 头和尾经常会变动,你是不是想为每张发票头尾写一个程序,然后大部分都是重复代码! 没人想这么做. 所以我们要封装细小变化,至于decorator如何封装细小变化的,自己领悟吧.
wueg2003 2003-07-31
  • 打赏
  • 举报
回复
他的好处是可以在头部与尾部可以动态的改变,用别的方法还不能做成这样。
jeffyan77 2003-07-31
  • 打赏
  • 举报
回复
我不认为书中那个例子是唯一的和最好的解决方案,如果你用两个类,可能也是很好的。

当时我需要找个例子说明Decorator的应用,于是就找了那个例子。那个例子在很多文献里都用到过,不是我的发明,Decorator的例子不好找。

大家讨论,呵呵。
jouny0 2003-07-31
  • 打赏
  • 举报
回复
学习
difficult 2003-07-31
  • 打赏
  • 举报
回复
用不同类实现也可以进行随意组合呀?
jyxhb 2003-07-31
  • 打赏
  • 举报
回复
我觉得他举的那个发票的例子主要的是解决发票的头部和尾部的多种可能格式的问题的!
用户可以随意的选择任何一个头部和任何一个尾部进行组合!如果跟楼主说的那样用两个类来实现比较困难!

50,530

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧