【推荐阅读:Jsp与Mysql连接探究查错】
从我们的专业角度来讨论一些存在的实例: 【扩展信息:关于JSP中文问题的解决方法】 1 jscrollpane可以装饰jcomponent的视图部分.jcomponent本身并不会被改变,但是增加了一个新的属性(可滚动). 2 bufferedinputstream是inputstream的装饰子,本身bufferedinputstream就是一个inputstream,但是它更快,因为提供了对数据的缓存. 3 考虑一下debugbutton,它与jbutton一样,但是它在被点击时可以向日志文件添加消息.debugbutton是jbutton的装饰子,因为它直接改变了jbutton但并没有改变它的自有属性. 4 再又如scrolloverbutton,它增加了一个鼠标滑过的行为.当鼠标移出时它是平的,当鼠标经过时它具有一个凸起的边框.很显然,scrolloverbutton也是jbutton的装饰子. 现在,我们知道decorator可能有三种不同的实现: 1 继承(inheritance) 2 封装(wrapper) 3 外挂(external) 本文将讨论每一个实现模型,以及它们的优缺点. 继承 对于开发人员而言,最直观的decorator实现就是:写一个派生类,它继承自被装饰类,并赋于新的职责.新的职责可以是通过增加方法或是修改已有方法来实现. public class debugbutton extends jbutton { public debugbutton() { addactionlistener(new actionlistener() { system.out.println("debug message"); }); } } 此外,我们也可以用相同的方式来实现scrolloverbutton:不是增加actionlistener,而是增加mouselistener.在mouselistener回调方法中改变jbutton的边框,当mouseentered()被调用时,将边框从empetyborder变为raisedbevelborder.而当mouseexited()方法被调用时,再将边框从raisedbevelborder恢复成empetyborder. 对于bufferedinputstream,同样实现也是非常简单的.修改每个读数据的方法,让它从内存缓冲区来读取数据.如果缓冲区是空的,它可以通过super.read()方法来获取数据并填充缓冲区.jscrollpane,要实现起来就有点复杂,下面我将讨论为什么它会比较难以用继承的方式来实现. 讨论一下继承方式实现decorator模式的优点与缺点: 优点 1 我们几乎可以用这个方式实现所有的decorator. 2 使用继承方式实现decorator模式,可以保留被装饰类的原始类型,这一点是非常重要的.... 下一页