今天先说一下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(); } }