快速业务通道

Java中Decorate的三种实现方法 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23
getInstance() ?? { ???? return inst; ?? } ?? public void decorateDebug(JButton butt) ?? { ???? butt.addActonListenr(this); ?? } ?? public void undecorateDebug(JButton butt) ?? { ???? butt.removeActonListenr(this); ?? } ?? // ActionListener ?? public void actionPerformed(ActionEvent evt) ?? { ???? JButton src = (JButton)evt.getSource(); ???? System.out.println("debug message for button" + src); ?? } }

?üμ?ó?·¨è???£o

JButton myButt = ... . . . . . . . . // Add external decorator DebugDecorator.getInstance().decorateDebug(myButt); . . . . . . . . . // Remove external decorator DebugDecorator.getInstance().undecorateDebug(myButt); . . . . . . . . .

?ù???óD?μ?decorate()·?·¨oíundecoratedDebugContainer()·?·¨£o

public void decorateDebugContainer(JComponent container) { ?? Component[] comps = container.getComponents(); ?? for(int i = 0 ; i<comps.length; i++) ?? { ???? if(JButton.class.isInstance(comps[i])) ???? { ?????? comps[i].addActionListener(this); ???? } ?? } } public void undecorateDebugContainer(JComponent container) { ?? Component[] comps = container.getComponents(); ?? for(int i = 0 ; i<comps.length; i++) ?? { ???? if(JButton.class.isInstance(comps[i])) ???? { ?????? comps[i].removeActionListener(this); ???? } ?? } }

Java中Decorate的三种实现方法(6)

时间:2010-12-08

这样,我们就可以方便地将DebugDecorator应用于容器(例如ToolBar)了。

同样我们也可以编写出RollOverDecorator的实现,但是不能实现BufferedInputStream因为没有合适的监听器和回调方法。

再讨论一下外挂方式的优点与缺点:

优点:

这种实现永远不需要改变被装饰对象的类型。只要我们需要,就可以编写任意多的装饰器,并且可以任意地增加或移去它们。每个装饰器都是独立于其它装饰器。在增加或移去装饰器后,我们不需要改变任何代码就可以得到新的功能。这种方式可以便利地适应可视化对象的多变风格选择。

缺点:

不幸的是,这种方式不能应用于任何对象的装饰。它基于被装饰对象的回调(如监听器)和一些其它特性。换句话说,如果被装饰对象没有合适的特征我们就不能应用外挂方式的装饰器实现。

对于可视化对象,如果我们需要改变它的paint方法,则也不能使用外挂方式,比如,如果我们需要增加RoundButton。

虽然装饰器的外挂实现是非常简单,极易上手的,而且也符合面向对象的原则。但是它取决于被装饰对象的许多特性,如监听器、边框,布局管理,以及可拨插的外观风格。

总结

讨论了三种不同类型的装饰器实现,我们可以这样比较它们:

我看不出在任何场合使用继承来实现装饰器是明智的。它看上去很简单,但是在扩展性方面存在困难,并且违背了面向对象思想。建议不要使用这种方式来实现装饰器。

封装实现装饰器的方式体现了良好的面向对象设计,也适用于那些方法不太多的类。只是对于一个很长的类,开发人员必须作出一个比较痛苦的选择:是编写大堆的代码来保持被装饰对象的原始类型?还是放弃它的原始类型为了得到精炼的代码?而且,对于可视化对象而言,这种方法在很多场合是不适用的。

外挂地实现装饰器是易于使用的,也很好地体现了面向对象的思想。但是只能用于特定的类,它们需要提供一些特征来支持外挂,如监听器、边框、布局管理器以及可拨插的外观。对于可视化的对象,它可以工作地非常良好。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号