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….