Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3461979
  • 博文数量: 1450
  • 博客积分: 11163
  • 博客等级: 上将
  • 技术积分: 11101
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-25 14:40
文章分类

全部博文(1450)

文章存档

2017年(5)

2014年(2)

2013年(3)

2012年(35)

2011年(39)

2010年(88)

2009年(395)

2008年(382)

2007年(241)

2006年(246)

2005年(14)

分类: Java

2009-04-01 19:16:35

在Java Swing中的JTextArea元件预设并没有卷轴,因为设计人员认为卷轴的功能并不是一定需要的,而决定让程式人员可以动态选择是否增加卷轴功能,卷 轴的功能是由JScrollPane元件提供,如果您要加入一个具有卷轴功能的JTextArea,您可以如下进行设计:
JTextArea textArea = new JTextArea();
JScrollPane scrollPane = new JScrollPane(textArea);
 
JScrollPane对JTextArea即是个容器,而它对JFrame来说又是个元件,可以如下这般将之加入JFrame中:
getContentPane().add(scrollPane);
 
像这样动态的为JTextArea加入功能的方法,我们可以使用Decorator模式来组织结构,您可以动态的为一个物件加入一些功能(像是为 JTextArea加上卷轴),而又不用修改JTextArea的功能。对JTextArea来说,JScrollPane就好像是一个卷轴外框,直接套 在JTextArea上作装饰,就好比您在照片上加上一个相框的意思。

先以上面这个例子来说明Decorator模式的一个实例:
Decorator

如上图所示的,无论是TextView或是Decorator类别,它们都是VisualComponent的一个子类,也就是说它们都是一个可视元件, 而Decorator类又聚合了VisualComponent,所以又可以当作TextView容器,ScrollDecorator类别实作了 Decorator类,它可能是这样设计的:
public abstract class Decorator extends VisualComponent {
    protected VisualComponent component;

    public Decorator(VisualComponent component) {
        this.component = component;
    }

    public void draw() {
        component.draw();
    }
}

public class ScrollDecorator extends Decorator {
    public ScrollDecorator(VisualComponent component) {
        super(component);
    }

    public void draw() {
        super.draw();
        scrollTo();
    }

    public void scrollTo() {
        // ....
    }
}
 
要将新功能套用至TextView上,可以这样设计:
ScrollDecorator scrollDecorator = 
                    new ScrollDecorator(new TextView());
 
super.draw()会先呼叫component也就是TextView物件的draw()方法先绘制TextView,然后再进行 ScrollPanel的scrollTo(),也就是卷动的方法。在图中也表示了一个BorderDecorator,它可能是这样设计的:
public class BorderDecorator extends Decorator {
    public BorderDecorator(VisualComponent component) {
        super(component);
    }

    public void draw() {
        super.draw();
        drawBorder();
    }

    public void drawBorder() {
        // ....
    }
}
 
要将ScrollDecorator与BorderDecorator加至TextView上,我们可以这样设计:
BorderDecorator borderDecorator =
         new BorderDecorator(
               new ScrollDecorator(new TextView()));

所以当BorderDecorator调用draw()方法时,它会先调用ScrollDecorator的draw()方法,而 ScrollDecorator的draw()方法又会先调用TextView的draw()方法,所以绘制的顺序变成:
TextDraw.draw();
ScrollDecorator.scrollTo();
BorderDecorator.drawBorder();

下图为物件之间的调用关系:
Decorator

Decorator模式的 UML 结构图如下所示:
Decorator

在Gof的书中指出另一个范例,它设计一个Stream抽象类,而有一个StreamDecorator类,Stream的子类有处理记忆体串流的 MemoryStream与FileStream,有各种方法可以处理串流,也许只是单纯的处理字元,也许会进行压缩,也许会进行字元转换,最基本的处理 可能是处理字元,而字元压缩被视为额外的功能,这个时候我们可以使用装饰模式,在需要的时候为Stream物件加上必要的功能,事实上在java.io中 的许多输入输出物件,就是采取这样的设计。
阅读(660) | 评论(0) | 转发(0) |
0

上一篇:适配器模式

下一篇:门面模式

给主人留下些什么吧!~~