今天先说一下Observer Pattern,然后结合一下MVC模式分析两者之间的联系.可能有说的不到之处,请看过的达人提出宝贵意见.

还是先说下定义,Observer模式定义对象间的一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。

Observer模式中包括几点要素:

1、主题对象,能对多个依赖于它的对象(多个观察者)进行处理,使之得到通知并自动更新.

2、观察者接口,接口是抽象出一个方法,用于更新观察者.

3、观察者对象,用于真正实现上述接口.

 

上面这些大家看下,下面直接上代码,代码中会一步一步说明MVC与Observer的对应关系

public interface IObserver //是否能看成IView
{
     void ShowForm(object modeo);
}

public class WebFormShow : IObserver 
{
    public void ShowForm(object modeo)
    { 
       //dosomething 
    }
}

public class WinFormShow : IObserver 
{
    public void ShowForm(object modeo)
    { 
       //dosomething 
    }
}

public interface IModel   //定义一个Model接口,也就是MVC中Model模型
{
    object ModelData();
}

public class Model : IModel  //MVC中Model不是我们以前所说的实体类(Entity),而是专门将业务逻辑层抽象出来,并且一步步从数据库读取的传输Data
{
    public object ModelData()
    {
        //dosomething 
       return …
     }
} 

public class Controller
{
    private List<IObserver> observers = new List<IObserver>();    //这里可以实现依赖注入 
    private IObserver view1 = new WebFormShow();

    //这里可以实现依赖注入 
    private IObserver view2 = new WinFormShow();

    //这里可以实现依赖注入 
    private IModel model = new Model();

    public void Update(){    
       object o = model.ModelData();     
       foeach (IObserver ob in observers) {         
          ob.ShowForm(o);     
       }
    }

    public void AddObserver(IObserver observer) {  
       observers.Add(observer);
    }  

    public void RemoveObserver(IObserver observer) {  
      observers.Remove(observer);  
   } 
}

在MVC模式中视图是观察者Observer,Controller控制器担当视图和模型的中介者,因此这里的MVC模式是采用Observer模式、中介模式的复合模式,但是有一点,Controller是View和Model之间的中介,但是在Asp.Net MVC中,View和Model存在直接的联系。View也是可以直接调用Model查询其状态信息。当Model状态发生改变的时候,它也可以直接通知View.

Model在MVC架构中起的作用非常重要,它才是UI业务逻辑真正的实现层。所以Model的实际上是Business Model(业务模型).

而 Controller仅仅起一个"桥梁"作用,它负责把View的请求转发给Model,再负责把Model处理结束的消息通知View。 Controller就是一个消息分发器。Controller是用来解耦View和Model的,具体一点说,就是为了让UI与逻辑分离(界面与代码分离)。

MVC的View直接与Model打交道,Controller只转发请求(View的请求)和通知(Model处理完之后的通知),不传递数据(业务结果),而是由View直接向Model拿数据.

在MVC中视图和控制器都依赖于模型。但是,模型既不依赖于视图,也不依赖于控制器。这是分离的主要优点之一。在许多胖客户端应用程序中,视图与控制器的分离是次要的,实际上,许多用户界面框架将角色实现为一个对象。另一方面,在 Web 应用程序中,视图(浏览器)与控制器(处理 HTTP 请求的服务器端组件)的分离是很好定义的。

从消息交换模式的角度来讲,Model针对View的状态通知和View针对Controller的用户交互通知都是单向的,我们推荐采用事件机制来实现这两种类型的通知。从设计模式的角度来讲就是采用观察者(Observer)模式通过注册/订阅的方式来实现它们,即View作为Model的观察者通过注册相应的事件来检测状态的改变,而Controller作为View的观察者通过注册相应的事件来处理用户的交互操作。

如此我们再将上面的代码再使用事件机制来实现.

public class Controller
{

    public Action<object> ActionEvent;

    //这里可以实现依赖注入 
     private IObserver view1 = new WebFormShow();

    //这里可以实现依赖注入 
     private IObserver view2 = new WinFormShow();

     public void Update() {    
        object o = model.ModelData();    
        OnNotifyChange(o);
     }

     public void OnNotifyChange(object o) {   
        if (ActionEvent != null)   {        
          ActionEvent(o);    
        }
     }

     public void Test() {  
        this.ActionEvent += view1.ShowForm;    
        this.ActionEvent += view2.ShowForm;   
        this.Update();
    }
}

posted on 2013-09-02 17:59  tzj19810812  阅读(475)  评论(0编辑  收藏  举报