A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马_张佳超 中级黑马   /  2012-6-20 09:20  /  2011 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黑马_张佳超 于 2012-6-20 22:20 编辑

装饰设计模式:当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能。
是不是功能增强就是动态为对象增加功能?那这些功能可不可以动态撤销,如何撤销呢?

8 个回复

倒序浏览
装饰设计模式中的功能增强指的是基于原有功能的基础上,接收原有功能,并增强该功能。你指的动态的意思是装饰设计模式的灵活性,它和原有类没有直接的关系,与被装饰类处于同一个体系中。它的这种功能增强其实就是额外的附加了一些新功能,原有的功能就直接接收过来。所以你想要删除当然是可以的,但是既然是功能增强,为什么要去删除呢,或者如果你觉得这个装饰类中的有些功能已经过时,那么你可以重新定义一个装饰类,将原有的装饰类作为被装饰对象也是可以的。
回复 使用道具 举报
你是为了增强一个对象的功能,才使用装饰设计模式,将已有对象传入,这个对象的功能是基于传入的那个对象的,但是对该功能实现增强;
你说的撤销功能,不知道你说的是那个功能,我觉得这个对象的功能既然是基于被传入的那个对象的,如果你撤销了这个功能,那么这个对象不就连基本的功能也没有了吗?
回复 使用道具 举报
孟浩然 发表于 2012-6-20 09:31
你是为了增强一个对象的功能,才使用装饰设计模式,将已有对象传入,这个对象的功能是基于传入的那个对象的 ...

恩。装饰模式不单可以扩展增强一个类的功能方法,还可以给一个类增加附加功能操作。其他功能是如何增加和撤销的呢?
回复 使用道具 举报
胡卿 发表于 2012-6-20 09:30
装饰设计模式中的功能增强指的是基于原有功能的基础上,接收原有功能,并增强该功能。你指的动态的意思是装 ...

一个类能被装饰,难道不能撤销不需要了的装饰?
回复 使用道具 举报
装饰设计模式,现实中就好比前段卖的很火的苹果皮,苹果全视角摄像头,苹果无线充电器......等各种苹果周边产品,你给我个苹果手机,然后我把自己弄的周边产品添加上去,苹果手机又多了一项功能,但是核心的功能呢还是要通过苹果自己的组件来完成。
如果是想撤销某些功能的话,可在此装饰类对外提供的方法上做些修改,让其不再调用被装饰类的相关函数。但是前提得是此函数不是你的被装饰类的唯一功能~
回复 使用道具 举报
装饰模式是在不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

动态地给一个对象添加一些额外的职责。就增加功能来说,Decorate 模式相比生成子类更为灵活。   

在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。   
处理那些可以撤消的职责。   
当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。  

实质就是 Wrapper. 一层一层的封装。可以封装任意层。

BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(...)));

也就是一层一层地添加些功能,节省点类。

我们就不用写 BufferedInputStreamReader 这种类了。
回复 使用道具 举报
杨朔 中级黑马 2012-6-20 10:06:38
8#
装饰模式是在不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能。它是通过创建一个包装对象,
也就是装饰来包裹真实的对象。你想功能扩展当然要用这个,要是不想就不用这个设计模式了。
回复 使用道具 举报
耿鑫 中级黑马 2012-6-20 14:07:10
9#
首先你要明确装饰模式的目的是什么?是为了增强功能,起初那几位大神的目的就是为了增强功能。你没事要把装饰模式的增加功能撤销掉,那几位大神不得哭啊,这个设计模式不白设计了吗?另外你不想用装饰模式的增强功能,你完全可以不使用啊,就像你不想使用BufferedReader一样,你可以直接使用FileReader啊。一旦你使用了BufferedReader就不能撤销掉它的功能了,你说你用 new BufferedReader(new FileReader()) 还想不要缓冲区读,那是不可能的。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马