这里也讨论一下观察者模式的优缺点:
  a.观察者模式在订阅者和发布者之间建立一个抽象的耦合。发布者只知道一个订阅者列表。抽象了具体的发布者和订阅者,减少了二者之间的耦合性;
  b.观察者模式支持广播通讯。发布者回想所有登记的订阅者发出通知。
  c.如果一个发布者有很多直接或间接的订阅者,将所有的订阅者通知到会花费一定的时间;
  d.如果发布者和订阅者之间有依赖循环的话会导致系统崩溃;
  e.订阅者虽然知道发布者发生了变化,但是不知道对方是如何发生变化的.
  4.游戏中委托的使用
  游戏中的一些消息机制是通过委托来实现的,以游戏中属性变化为例,在界面的声明周期开始,我们调用:sysTem.AddUIListener(DgMsgID.NetRes_Profile,OnProfile);为我们的委托字典对应的键上添加一个响应方法;
  在界面的生命周期结束时,我们调用:Messenger.RemoveListener(DgMsgID.NetRes_Profile,OnProfile);将我们的委托字典上对应键上的该方法移除。
  当我们从服务器接收到的数据更新了角色属性时,则会广播该消息,调用委托字典上该键上所添加的所有方法:Messenger.Broadcast<PlayerProfile>(DgMsgID.DgMsg_UpDatePlayerProfile,response.profile);
  而在Messenger类中上述方法的实现其实是添加、伤处、调用委托字典上的对应键上添加的方法。
  另外一个典型应用是NGUI定义的UIEventListener类,该类中定义了很多自定义委托,用于处理UI的各种操作响应,如:
  publicdelegatevoidVoidDelegate(GameObjectgo);
  publicdelegatevoidBoolDelegate(GameObjectgo,boolstate);
  publicUIEventListener.VoidDelegateonClick;
  publicUIEventListener.BoolDelegateonPress;
  voidOnClick(){if(onClick!=null)onClick(gameObject);}
  voidOnPress(boolisPressed){if(onPress!=null)onPress(gameObject,isPressed);}
  使用时也很简单,如:
  UIEventListener.Get(targetObj).onPress+=onPressHandler;