这么多设计模式,我的看法和理解

04-04-23 chinahero
    

一直在做与数据库相关的企业应用,感觉到用的最多的设计模式是

Factory和Singleton

而什么观察者模式啊,桥模式,好象根本没什么用,不过最近在用awt,感觉到java的awt实现用了这些模式,不知道为什么要这样用

    

1
recher
2004-06-10 12:27

首先我是一个模式设计低手,我想说的一点自己的体会就是,就拿观察者模式并不是那么简单,其实观察者模式可以应用在底层的代码(java bean)可以方便一些类间存在触发/调用(类的事件)关系(虽然不用模式也可以实现,但是运用观察者模式代码量减少,类的偶合关系就更小)。我个人感觉模式的运用千变万化,别人说的模式例子只是想说明模式适用方面(精髓)但是在自己应用的时候可以先考虑系统要实现的场景有没有适用的模式(广的方面,小的方面也是这样)。

SportsBaby1980
2004-06-10 15:47

我最近也在研究模式。

我对模式的理解就是:

一句话可以用白话讲,很长

而如果这个含义可以用成语讲,岂不是更妙?

模式就和成语一样,只是不同领域有不同的用途。

适合用成语的时候,可以用,但是不适合的时候还是讲白话吧。

所以我很注重模式的应用场景,以及模式的组成,这两者必须熟练了

才能用的很熟。

一个成语,如果不了解其含义,我想谁也不会用吧?

同样,对于模式,仅仅知道模式的名字是不行的

了解含义也就是 应用场景和模式的组成

是使用的前提。

banq
2004-06-15 15:33

大家理解非常棒,希望更多人发表自己的看法,用自己的语言。

buaawhl
2004-07-09 18:36

Design Pattern Practice

1.序

本文从一个简单的多列排序的例子入手,由浅入深地讲解Design Pattern(设计模式)的目的、分析和实践。

文中的例子用到Compositor Pattern和Decorator Pattern。

同时,文中的例子也提供了一类问题(条件组合问题)的解决方案。

2.问题的引入

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

下面举个排序的例子,说明如何抽取问题中的不变部分。

假设一个Java类Record有field1,field2,field3等字段。

public class Record{
	public int field1;
	public long field2;
	public double filed3;
};
<p>

我们还有一个Record对象的数组Record[] records。我们需要对这个数组按照不同的条件排序。

首先,按照field1的大小从小到大进行升序排序。

排序函数如下:

void sort(Record[] records){
  for(int i =…){
    for(int j=…){
      if(records[ i ].field1 > records[ j ].field1)
      // swap records[ i ] and records[ j ]
    }
  }
}
<p>

其次,按照field2的大小从小到大进行升序排序。

void sort(Record[] records){
  for(int i =…){
    for(int j=…){
      if(records[ i ].field2 > records[ j ].field2)
      // swap records[ i ] and records[ j ]
    }
  }
}
<p>

再次,按照field3的大小从小到大进行升序排序。

...

这种要求太多了,我们写了太多的重复代码。我们可以看到,问题的变化部分,只有判断条件部分(黑体的if条件判断语句)。

我们可以引入一个Comparator接口,把这个变化的部分抽取出来。

public interface Comparator(){
	public boolean greaterThan(Record a, Record b);
};
<p>

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 ]
    }
  }
}
<p>

这样,对应第一个要求――对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;
  }
}
<p>

sort函数的调用为:

sort(records, new CompareByField1());
<p>

这样,对应第一个要求――对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;
  }
}
<p>[code]

sort函数的调用为:
<p>[code]
sort(records, new CompareByField2());
<p>

按照C++ STL的叫法,这里的sort称为算法(Algorithm),records称为容器(集合),Comparator称为函数对象(Function Object)。

JDK的java.util.Collections类的sort方法和java.util.Comparator接口就是按照这样的思路设计的。下面我们来看看如何应用sort和Comparator解决多列排序问题。

9Go 1 2 3 4 ... 9 下一页