Design Pattern Introduction

类别:Java 点击:0 评论:0 推荐:
Design Pattern Introduction

Design Pattern(设计模式)的目标是,把共通问题中的不变部分和变化部分分离出来。不变的部分,就构成了Design Pattern(设计模式)。这一点和Framework(框架)有些象。

下面举个Design Pattern的例子。

假设有一个Java类,Record。

public class Record{

       public int field1;

       public long field2;

       public double filed3;

};

现在有一个Record类对象的数组,Record[] records;

要求如下,对records数组按照field1的大小排序。

做一个sort函数,如下:

void sort(Record[] records){

       for(int i =….){

              for(int j=….){

                     if(records[i].field1 > records[j].field1)

                            // swap records[i] and records[j]

              }

       }

}

现在问题变化,需要对records数组按照field2的大小排序。sort函数,如下:

void sort(Record[] records){

       for(int i =….){

              for(int j=….){

                     if(records[i].field2 > records[j].field2)

                            // swap records[i] and records[j]

              }

       }

}

同样,还有第三种要求,按照filed3的大小排序,按照filed1和field2的大小排序。

可以看得出来,这些问题的变化的部分,就是判断条件的变化(黑体的if条件判断语句)。

所以可以这样设计,引入一个Comparator接口。

public interface Comparator(){

       public boolean greaterThan(Record a, Record b);

};

sort函数如下:

void sort(Record[] records, Comparator compare){

       for(int i =….){

              for(int j=….){

                     if(compare.greaterThen(records[i], records[j]))

                            // swap records[i] and records[j]

              }

       }

}

 

这样,对应第一个问题,对records数组按照field1的大小排序。

做一个实现Comparator接口的类,CompareByField1.

public class CompareByField1 implements Comparator{

public boolean greaterThan(Record a, Record b){

       if(a.filed1 > b.filed1){

              return ture;

       }

       return false;

}
}

调用sort函数, sort(records, new CompareByField1());

 

这样,对应第一个问题,对records数组按照field2的大小排序。

做一个实现Comparator接口的类,CompareByField2.

public class CompareByField2 implements Comparator{

public boolean greaterThan(Record a, Record b){

       if(a.filed2 > b.filed2){

              return ture;

       }

       return false;

}
}

调用sort函数, sort(records, new CompareByField2());

 

在JAVA JDK的接口设计中,有很多Design Pattern(设计模式)思想的优良体现。

例如,关于以上的排序问题,可以参照 java.util.Collections 类的sort 方法,和java.util.Comparator接口。

还有,AWT和Swing包里的事件机制(ActionListener),后面会提到。

 

Event Mechanics

事件机制

面向对象编程中的事件机制,都是采用Observer Pattern实现的。比如前面提到的,Java的AWT和Swing包里的事件机制(ActionListener)。C#里面的delegate。其工作原理也可以用Publisher/Subscriber Pattern来解释。比如我们订阅手机短信,加入邮件列表,等等。每隔一定时间,Publisher(发布者)会把消息(事件)通知我们。但这种”推”来的消息,对Subscriber(订阅者)的意义不大,而且有可能影响重要消息的处理,比如垃圾邮件的问题。其实,对于某个人的垃圾邮件,对于另外的人,可能是有用的信息。问题是这种推的方式,不加区别地把相同的信息广播(或组播,比如主题订阅的情况)给所有的Subscriber(订阅者)。

那么,”拉”的方式又如何呢?我想,可以分为三个层次。

1.Internet Agent

这是最高的层次,使用一个Agent(智能代理),具有网络蜘蛛的基本功能,按照用户的定义,自动地在网上搜索有意义的信息。这个层次涉及到人工智能,自然语言语义分析。

2.实时反应系统。微软称之为神经网络。

这种系统能够实现全球范围的实时信息共享。在这种系统中,每个Subscriber(订阅者)都只收到重要的变化的信息。比如,一个炒股的人,只关心某几支股票的行情,当这几支股票的股价变化超过一定的范围,系统就会及时地通知用户。

3.个性化定制

MY MSN是个很好的例子。个性化定制,对一些商业网站极其重要,对于不同的顾客,提供不同的界面和服务。

提到网站的个性化定制,Apache的Cocoon Project 非常引人注目。Cocoon是构成IBM电子商务解决方案的重要部分。Cocoon也被包含在JBuilder 企业版里面。

Cocoon的构建技术: J2EE, XML, XSLT, XSP。

Cocoon以一种类似生产线的管道方式工作,通过原始的XML,经过生产流程上的各种环节,输出不同的格式,html, pdf, xhtml….

本文地址:http://com.8s8s.com/it/it17957.htm