站内搜索: 请输入搜索关键词

当前页面: 开发资料首页Java 专题Design Pattern

Design Pattern

摘要: 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….
作者相关文章: Java Thread应该注意的问题(原作) Design Pattern Introduction – catch the core(原作) About Name Directory Service (in English)(原作)
对该文的评论 人气:1225 buaawhl(2003-3-10 11:53:36)
多谢支持。 在书店里,在网上,看到大量的重复信息。 一个名词出来,市场就疯狂地复制同样的资料,以求利润。而忽略了很多应该注重的方面。 我尽量写一些“边缘”材料,选择新的切入点,覆盖一些其他资料没有涉及到的方面。 尽量避免撰写重复的内容。 如果大家在其他地方看到一些资料,和我写的东西有雷同、重复、人云亦云之嫌,请提醒我。
buaa是北航的缩写。我从那里毕业。很高兴遇到校友。:-)
ailon(2003-3-8 18:38:20)
我是专科生,向来重视模式,ailons@21cn.com
XiGuaDao(2003-3-8 12:12:51)
不错!希望你能在写一些介绍design pattern的文章,就像你现在的这篇的。
flmn(2003-3-7 11:35:54)
哥哥你北航的吧?有空多联系哦
zhiwen_huang(2003-3-7 11:20:30) 好!
lanying(2003-3-7 10:49:21)
写得比较通俗,好!
↑返回目录
前一篇: DES对称加密的实现及其源代码(原创)
后一篇: Design Pattern Introduction – catch the core