社区
Java
帖子详情
看了阎宏的java与模式一书,说Decorator模式可以动态地给一个对象增加功能,并可动态的撤销,这一点是如何体现出来的?
difficult
2003-07-31 10:37:39
第26章Decorator模式部分,发票系统这个范例中,对打印发票头部和发票尾部用Decorator模式,我觉得并没有体现出有什么好处,如对发票头部和发票尾部分别用两个类来实现,这样系统还简单一些,且思路清晰。
欢迎大家一起讨论?
...全文
16
14
打赏
收藏
看了阎宏的java与模式一书,说Decorator模式可以动态地给一个对象增加功能,并可动态的撤销,这一点是如何体现出来的?
第26章Decorator模式部分,发票系统这个范例中,对打印发票头部和发票尾部用Decorator模式,我觉得并没有体现出有什么好处,如对发票头部和发票尾部分别用两个类来实现,这样系统还简单一些,且思路清晰。 欢迎大家一起讨论?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
打赏
举报
回复
我觉得他举的那个发票的例子主要的是解决发票的头部和尾部的多种可能格式的问题的!
用户可以随意的选择任何一个头部和任何一个尾部进行组合!如果跟楼主说的那样用两个类来实现比较困难!
Java
精华【免费版】
DateFormat,Calendar、文件与流、
Java
变量类型间的相互转换、
Java
与Web、用连接池提高Servlet访问数据库的效率、
Java
扩展、应用服务器的集群策略及
Java
EE 5.0、
Java
IO 包中的
Decorator
模式
等。
浅谈
JAVA
设计
模式
之——装饰
模式
(
Decorator
)
就
增加
功能
来
说
,
Decorator
模式
相比生成子类更为灵活。 二、适用性 1.在不影响其他
对象
的情况下,以
动态
、透明的方式给单个
对象
添加职责。 2.处理那些可以撤消的职责。 3.当不能采用生成子类的方法进行扩充时。 ...
Java
设计
模式
——装饰器
模式
一、概述 装饰
模式
可以在不改变一...装饰
模式
(
Decorator
Pattern):
动态
地给
一个
对象
增加
一些额外的职责,就
增加
对象
功能
来
说
,装饰
模式
比生成子类实现更为灵活。装饰
模式
是一种
对象
结构型
模式
。 装饰
模式
是一种用于替
设计
模式
-装饰者
模式
(
Decorator
Pattern)
装饰者
模式
定义 在不改变原有
对象
的基础上,将
功能
附加到原有
功能
上,进行...需要
动态
地给
一个
对象
增加
功能
,这些
功能
也可以
动态
地被
撤销
。 优点 通过使用不同装饰类以及这些类的排列组合,可以实现不同的效果。 ...
Java
设计
模式
-装饰器
模式
(
Decorator
)
使用的场景:1、扩展
一个
类的
功能
。2、
动态
增加
功能
,
动态
撤销
。
Java
50,530
社区成员
85,610
社区内容
发帖
与我相关
我的任务
Java
Java相关技术讨论
复制链接
扫一扫
分享
社区描述
Java相关技术讨论
java
spring boot
spring cloud
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章