博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AS3_MVC
阅读量:4106 次
发布时间:2019-05-25

本文共 2498 字,大约阅读时间需要 8 分钟。

观察者模式是当你不想使用Swiz,C
airngorm,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. }

转载地址:http://thjsi.baihongyu.com/

你可能感兴趣的文章
python实现100以内自然数之和,偶数之和
查看>>
python数字逆序输出及多个print输出在同一行
查看>>
python九九乘法表(详解)
查看>>
ESP8266 WIFI数传 Pixhaw折腾笔记
查看>>
苏宁产品经理面经
查看>>
百度产品经理群面
查看>>
去哪儿一面+平安科技二面+hr面+贝贝一面+二面产品面经
查看>>
element ui 弹窗在IE11中关闭时闪现问题修复
查看>>
vue 遍历对象并动态绑定在下拉列表中
查看>>
Vue动态生成el-checkbox点击无法选中的解决方法
查看>>
python __future__
查看>>
MySQL Tricks1
查看>>
python 变量作用域问题(经典坑)
查看>>
pytorch
查看>>
pytorch(二)
查看>>
pytorch(三)
查看>>
pytorch(四)
查看>>
pytorch(5)
查看>>
pytorch(6)
查看>>
opencv 指定版本下载
查看>>