申明:本系列文章中的大多数代码与部分文字来源于网络,版权归其所有人所有.
14.facade 【程序编程相关:[原创]打破Java异常处理规则】
13.decorator 【推荐阅读:[原创]Linux下进行Java开发的一】
16.observer 【扩展信息:[原创]过滤器的应用】
15.iterator
17.template method
13.decorator说明:我开始看这个模式的时候,看了好几遍c#代码描述的装饰模式,也许是我功力不行也许是代码过于简单(不是看不懂代码),我怎么也想不通它的好处.直到看了下面这个java的例子才转过弯来.这是一种对子类化(这里指派生子类)的补充功能,在c#中用的是接口实现的,简言之,就是在不合适子类化的时候用下面的这种方法实现子类功能的扩展.c#的例子我就不给出了,大家仔细看这个java的代码应该更容易理解.实例:
java程序员知道可以通过扩展一个类来改变类的行为与扩展一个类的功能.这个行为被称为继承,它是面向对象编程的一个重要的特性.举例来说,如果你想得到一个带有边框的swing类型标签,你可以子类化javax.swing.jlabel类.然而,子类化并不总是有效.当继承不能解决问题的时候,你不得不求助与其它的方式.比如,使用decorator模式.
这篇文章解释了decorator模式是什么,并说明什么时候应该子类化,什么时候应该采用decorate模式.
在java语言中关键字extends被提供来子类化(扩展)一个类.具有丰富的面向对象编程经验的程序员知道子类化的威力.通过扩展一个类,我们能够改变这个类的行为.以列表1所讲的jborderlabel类为例,它扩展了javax.swing.jlabel类,除了多了一个边框,它与jlabel类具有相同的外观与行为.
列表 1 -- the jborderlabel class, an example of subclassing
package decorator;
import java.awt.graphics;
import javax.swing.jlabel;import javax.swing.icon;public class jborderlabel extends jlabel { public jborderlabel() { super(); } public jborderlabel(string text) { super(text); } public jborderlabel(icon image) { super(image); } public jborderlabel(string text, icon image, int horizontalalignment) { super(text, image, horizontalalignment); } public jborderlabel(string text, int horizontalalignment) { super(text, horizontalalignment); } protected void paintcomponent(graphics g) { super.paintcomponent(g); int height = this.getheight(); int width = this.getwidth(); g.drawrect(0, 0, width - 1, height - 1); }}要理解jborderlabel如何工作,我们首先要了解swing绘它的组件的原理. jlabel类同其它的swing组件一样,继承至javax.swing.jcomponent.swing.它们都是通过调用jcomponent组件的paint方法来画界面.我们可以通过重载jcomponent的公开方法paint来修改一个组件画界面的行为.下面是一个jcomponent的paint方法的定义.
public void paint(graphicsg)
作为paint方法的参数传进来的对象graphics是一个绘图面板.为了优化绘图这个操作,paint方法被分割成三个具有保护(protected)属性的方法:paintcomponent, paintborder, paintchildren.paint方法调用这三个方法同时将它接受到的graphics实例传递给这三个方法.下面是这三个函数的一个声明:
... 下一页