日期:2008-06-08  浏览次数:20398 次

好久没来坛子了,很想念大家,由于英国的课程很紧,没时间写东西,又是在公共机房,IE没装中文语言包,没有权限下载:(,就没法看国内站点,这次是放假回来几天,看到了开心的mail,终于又找到组织了。正好这学期学了点设计模式,这次给大家写点设计模式的东西吧。

首先,什么是设计模式呢?简单的说,设计模式是一种针对某一领域的特定的问题给出解决方案的模式。尽管大多数的项目是不同的,但是他们还是会面对许多有普遍性的问题。引用Christopher Alexander的一句话“每个设计模式都描述了一个在开发中屡次出现的问题,并描述了针对这个问题的核心的解决方案,这样你就可以无数次的使用这个方案,而不用每次重复的劳动”。但是请注意这个解决方案只是一个高度概念化的解决方案,它与特定的语言,平台或工具无关,它也不涉及到实现的细节。
设计模式大致可分为三个大的类别,即Creational Patterns,Structural patterns,Behavioral patterns。

Creational Patterns,顾名思义,是处理对象创建的过程的,描述了对象是怎样被创建的,谁在创建对象上有控制权,何时对象被创建以及用现有的对象创建其他的对象的对象之间的关系。这种类型的模式给系统带来极大的灵活性和可扩展性,这是由于在实际的对象和客户端使用的对象之间总是有一个间接的层。通过封装对象的创建过程,我们可以避免重复编写对象之间的关系和封装的代码。这个类别中两个最常见的模式是Factory pattern和Singleton pattern。
a)在Factory pattern中总是有一个factory对象负责产生其他对象的实例。客户端从factory中请求一个特定类型的对象,factory决定什么对象被实例化。这种模式的优点是客户端可以不去考虑事实上是什么对象被创建(这通常是基于interface的),客户端可以不去考虑复杂的对象细节。这就可以使我们在改动例示的对象的同时无需改动客户端的代码。这样如果需求有变化时,你所需要做的只是改变factory去产生一个不同的对象。COM是在很大程度上依赖这种模式的IClassFactory用来例示COM对象.
用图来表示就是:
    InterfaceI
    |    |    |
      ObjA  ObjB ObjC
    |    |    |
      Factory-------ClientObjcect    
例子:
public interface IShape
{
    void Draw();
}

public class Square : IShape
{
   public void Draw()
   {
      MessageBox.Show("Drawing a square", "Square");
   }
}

public class Circle : IShape
{
   public void Draw()
   {
      MessageBox.Show("Drawing a circle", "Circle");
   }
}
注意:这段代码很简单,创建Interface,square和circle类


例子:
public class ShapeFactory
{
   private ShapeFactory() {}

   public static IShape CreateShape (int iID)
   {
      switch (iID){
         case 0:
            return new Square();
            
         case 1:
            return new Circle();

         default:
            return null;
      }
   }
}
注意:factory用一个参数来确定对象是否需要创建,然后返回一个Interface指针。这是关键所在,返回的是Interface指针而不是实体类指针,内部类的实现总是对客户端封装的。

例子:    
private void btnDraw_Click(object sender, System.EventArgs e)
      {
         IShape lShape;
         lShape = ShapeFactory.CreateShape(cbShape.SelectedIndex);
         lShape.Draw();
      }
注意:客户端总是操作Interface

b)在Singleton pattern中,顾名思义,在系统的lifecycle中总是有一个单独的例示对象。这种模式中有一个友好的访问例示对象的方法,用来保证所有的客户端都能访问singleton对象.这种模式在所有的请求都要被重定向到“一个”对象时很有用,它在COM中也很常见,CoGetClassObject 返回一个对象的引用,这个对象就是singleton对象.MFC应用程序经常用singleton对象来访问基类对象(如CWinApp等)。
例子:
public class SingletonObject

{
   // prevent direct creation of this object
   private