1) 创建ActionFacade的实例_facade,ActionFacade是Façade的实现类,并注册相关的Command,如在观察者模式讲到的,把相关的Command封装到Observer中,并注册到View内,其响应的通知名称为“login”
override protected function initializeController( ) : void
{
super.initializeController();
registerCommand( STARTUP, StratCommand );
this.registerCommand( LOGIN, LoginCommand );
}
2) 调用_facade.login(user)
public function login( user:UserVo ):void
{
sendNotification( LOGIN, user );
}
3) 实际上是调用父类Façade的sendNotification方法
public function sendNotification( notificationName:String, body:Object=null, type:String=null ):void
{
notifyObservers( new Notification( notificationName, body, type ) );
}
而Façade方法notifyObservers
public function notifyObservers ( notification:INotification ):void {
if ( view != null ) view.notifyObservers( notification );
}
也就是说要调用View的notifyObservers方法
4) View的notifyObservers方法如下,遍历所有关注这个通知(名称)的Observer,依次执行这些Observer的notifyObserver方法。
public function notifyObservers( notification:INotification ) : void
{
if( observerMap[ notification.getName() ] != null ) {
var observers:Array = observerMap[ notification.getName() ] as Array;
for (var i:Number = 0; i < observers.length; i++) {
var observer:IObserver = observers[ i ] as IObserver;
observer.notifyObserver( notification );
}
}
}
5) 下面来看Observer的notifyObserver方法
public function notifyObserver( notification:INotification ):void
{
this.getNotifyMethod().apply(this.getNotifyContext(),[notification]);
}
这个方法很简单,获取这个Observer封装的响应通知的方法(如exectue()),并把对应的上下文(如Controller),和通知作为参数来执行,呵呵!很像java中的反射机制。
6) 如在观察者模式的应用中讲到的,执行了Controller的executeCommand方法,从而遍历Command数组,找到响应这个通知的Command(如LoginCommand),并执行这个Command的exectue方法。