在PureMVC中,通知(Notification)贯穿整个框架,把观察者模式发挥得淋漓尽致。MVC的三层通信都是通过Notification来通信。Notification由两部分组成:Name和Body。如果把Notification当作是邮件,那么Name就是收件人,不过在PureMVC中可以有多个观察者(Observer)接收相同的邮件,Body自然就是Notification的内容了。Notification和Observer的关系是1:N,这点可以从View层的代码中看出来。
observerMap = new Dictionary<String, IList<IObserver>>();
Observer有两个属性:
private String notify;
private Object context;
notify是方法名,context是方法的载体。当Observer接收到Notification时,将调用下面的方法
public void notifyObserver(INotification notification)
{
Type t = this.getNotifyContext().GetType();
BindingFlags f = BindingFlags.Instance | BindingFlags.Public | BindingFlags.IgnoreCase;
MethodInfo mi = t.GetMethod(this.getNotifyMethod(), f);
mi.Invoke(this.getNotifyContext(), new Object[] { notification });
}
来执行notify这个方法。
PureMVC中,注册Observer和通知Observer都是在View层进行的。
public interface IView
{
void registerObserver (String notificationName, IObserver observer);
void removeObserver(String notificationName, Object notifyContext);
void notifyObservers(INotification note);
我觉得这点设计得不太好,使得View层和Observer产生了耦合,这些事情本不应该由View层来做的。而且,Observer接收的Notification不仅仅来自于View,还会来自于Controller和Model,那么,根据AOP的原则,应该把这部分的操作应该从MVC层的纵向分离出来,改为横向模式。可以创建一个观察者公司Obsertor(暂且这样叫它吧)来统一管理观察者,这样就可以减轻View层的工作了。结构图如下: