AS3_MVC

来源:互联网 发布:供应链管理软件 java 编辑:程序博客网 时间:2024/06/03 21:02
观察者模式是当你不想使用Swiz,Cairngorm,Mate或PureMVC等框架,但是又想在你的程序或网站中更加舒适有效地组织你的事件时非常有用的设计模式之一。
维基百科中的定义:
?        观察者模式(有时又被称为发布/订阅模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实作事件处理系统。

更多信息或你想看UML图,可访问维基百科的网站

当你想要以特殊的信息通知相关的对象时,你可以使用这种设计模式;例如,假设你有100个按钮,你可以显示、隐藏其中的奇数或偶数个;它们在哪添加不重要,即使在显示列表里甚至在另一个显示列表里,因为观察者模式采用通知的形式来处理事件。
如果你工作时通常以事件机制处理,你必须知道你的组件在哪,如果它被10个不同的容器嵌套你必须派遣监听每个组件的这一事件...这太可怕了!
观察者模式可以解决这个问题,因为它就像一个事件引擎可以获取所有可以对一个通知产生反应的物体并且通知所有组件。当你用它工作时,你可以在你的产品的任何地方使用它,相信我!
让我们来看看观察者模式是怎样工作的:
      首先,你应该创建一个IOberver接口,含有一个update方法,用来接收目标类别所发出的更新的通知:
  1. public interface IObserver {
  2.     function update(_notification:String):void;
  3. }
然后,你必须创建一个Observer Manager类用来管理所有含有IObserver接口的对象。

这个类应该有3个public的方法:subscribe,unsubscribe和notify。

当你想要在显示列表中添加一个对象并将通知更新到Observer中,你可以订阅;取消订阅当你从显示列表中删除一个对象或你不再需要更新,同时通知你想要通知的所有订阅此信息的对象:
  1. public class ObserverManager {

  2.         private static var instance : ObserverManager;        
  3.         private var observerData : Array;

  4.         public function ObserverManager():void
  5.         {
  6.                 observerData = new Array();
  7.         }



  8.         public static function getInstance() : ObserverManager
  9.         {
  10.                 if(instance == null)
  11.                         instance = new ObserverManager();
  12.                 return instance;
  13.         }

  14.                 

  15.         public function subscribe(observer:IObserver):void
  16.         {
  17.                 observerData.push(observer);
  18.         }

  19.                 

  20.         public function unsubscribe(observer : IObserver) : void 
  21.         {
  22.                 var totObs:int = observerData.length;
  23.                 for (var i:int = 0; i < totObs; i++)
  24.                 {

  25.                         if (observer === observerData[i])
  26.                         {
  27.                                 observerData.splice(i, 1);
  28.                                 break;
  29.                         }
  30.                 }
  31.         }

  32.         public function notify(_notification:String):void
  33.                 {
  34.                         var totObs:int = observerData.length;
  35.                         for(var i:int = 0; i < totObs; i++){
  36.                         observerData[i].update(_notification);        
  37.                 }
  38.         }
  39. }
复制代码
行了,现在你已经准备好使用观察者模式工作了,所以我们创建一个实现IObserver接口的对象,并且将更改添加到显示列表中所有实现IObserver接口的对象,同时修改所有相关通知。

下面是我们常见的按钮实现IObserver接口:
  1. public class ObserverButton extends Button implements IObserver
  2. {
  3.         public static const HIDE_BUTTON:String = "hideBtnEvt";
  4.         public static const SHOW_BUTTON:String = "showBtnEvt";
  5.         
  6.         public function ObserverButton()
  7.         {
  8.                 super();                        
  9.         }

  10.         public function update(_notification:String):void
  11.         {        

  12.                 switch(_notification)
  13.                 {                        
  14.                         case HIDE_BUTTON:
  15.                                 this.alpha = .2;
  16.                                 break;
  17.                                 
  18.                         case SHOW_BUTTON:
  19.                                 this.alpha = 1;
  20.                                 break;
  21.                 }                        
  22.         }
  23. }
从Observer Manger中订阅这些按钮:
  1. protected var observer:ObserverManager;
  2. protected function init():void
  3. {                                
  4.         observer = ObserverManager.getInstance();
  5.         for (var i:int = 0; i < 100; i++)
  6.         {                        
  7.                 var btn:ObserverButton = new ObserverButton();
  8.                 btn.label = i.toString()
  9.                 addElement(btn);
  10.                 
  11.                 if((i & 1) == 0)
  12.                         observer.subscribe(btn);
  13.                                         
  14.                 btn.x = Math.random() * 800;
  15.                 btn.y = Math.random() * 500 + 70;
  16. }
原创粉丝点击