收藏本站腾讯微博新浪微博

经典论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

蓝色理想 最新研发动态 网站开通淘帖功能 - 蓝色理想插件 论坛内容导读一页看论坛 - 给官方提建议

论坛活动及任务 地图和邮件任务 请多用悬赏提问 热夏来袭,选一款蓝色理想的个性T恤吧!

手机上论坛,使用APP获得更好体验 急需前端攻城狮,获得内部推荐机会 论坛开通淘帖功能,收藏终于可以分类了!

搜索
查看: 6597|回复: 22

[其它] 【设计模式】-2 观察者模式(基本版) AS3

[复制链接]
发表于 2008-3-17 22:20:15 | 显示全部楼层 |阅读模式
今天来介绍一下第二个模式:观察者模式。还是看源代码吧。里面有介绍
详情请点击这里:
一再强调,本人水平有限,学习这个只是无聊而已,并非达到很高的水平。还望路过的高手海涵。
请版主帮我把前面的那个装饰者模式改个标题:【设计模式】-1 装饰者模式 AS3http://bbs.blueidea.com/thread-2836210-1-2.html

源代码也可以到作者网站下载http://www.kenjor.com


  1. //-----------------------------------------------//第一个文件  信息中心的接口
  2. package com.dp.Observer {
  3.         import com.dp.Observer.Booker;       
  4.         /**
  5.          * @author www.kenjor.com
  6.          */
  7.         public interface IMessageCenter {
  8. //订阅 参数为订阅者
  9.                 function book(bo : Booker) : void;
  10.                 //退订 参数为订阅者
  11.                 function unbook(bo : Booker) : void;
  12.                 //派遣、发布
  13.                 function send() : void;
  14.         }
  15. }
  16. //-----------------------------------------------
  17. //第二个文件 订阅者接口
  18. package com.dp.Observer {
  19.         /**
  20.          * @author www.kenjor.com
  21.          */
  22.         public interface IBooker {
  23.                 //我的信箱,邮递员投递信息的邮箱,他把信息扔到你的”updata”这个信箱里。
  24.                 function update(str : String) : void;
  25.                
  26.         }
  27. }
  28. //------------------------------------------------
  29. //第三个文件 订阅者
  30. package com.dp.Observer {
  31.         import com.dp.Observer.IBooker;
  32.        
  33.         /**
  34.          * @author www.kenjor.com
  35.          */
  36.         public class Booker implements IBooker {
  37.                 //订阅者的用户名
  38.                 private var _name:String;
  39.                 public function Booker(name:String){
  40.                         //初始化时候定义用户名
  41.                         _name=name;
  42.                 }
  43.                 public function update(str : String) : void {
  44.                         //str为收到的信息
  45.                         trace(_name+"收到消息:"+str);
  46.                 }
  47.         }
  48. }
  49. //-----------------------------------------------
  50. //第四个文件 信息发布中心
  51. package com.dp.Observer {
  52.         import com.dp.Observer.IMessageCenter;
  53.         /**
  54.          * @author www.kenjor.com
  55.          */
  56.         public class MessageCenter implements IMessageCenter {
  57.                 private var mess : String = new String("message  from messageCenter");
  58.                 private  var bookers_arr : Array = new Array();
  59.                 public function MessageCenter() {
  60.                 }
  61.                         //订阅
  62.                 public function book(bo : Booker) : void {
  63.                                   //如果在订阅者群体(bookers_arr)中不存这个订阅者(bo),就把这个订阅
  64.                                  //者加入到订阅者群体中
  65.                                                if (bookers_arr.indexOf(bo) < 0) {
  66.                                 bookers_arr.push(bo);
  67.                         }
  68.                         ;
  69.                 }
  70.                         //退订
  71.                 public function unbook(bo : Booker) : void {
  72.                         //在订阅者群体中找到这个订阅者,然后帮他办理退订业务
  73.                         var b_index : int = bookers_arr.indexOf(bo);
  74.                         if(b_index >= 0) {
  75.                                 bookers_arr.splice(b_index, 1);
  76.                         }
  77.                 }
  78.                 public function send() : void {
  79.                         //给订阅者群体中的每个订阅者发送信息(报刊)
  80.                         var bookers_len : Number = bookers_arr.length;
  81.                         for(var i : Number = 0;i < bookers_len;i++) {
  82.                                 bookers_arr[i].update(mess);
  83.                         }
  84.                 }
  85.         }
  86. }
  87. //-----------------------------------------------
  88. //第五个文件  主文件 运行它
  89. package com.dp.Observer {
  90.         import flash.display.Sprite;
  91.         /**
  92.          * @author www.kenjor.com
  93.          */
  94.         public class Main extends Sprite {
  95.                 public function Main() {
  96.                         //实例化三个用户booker1,booker2,booker3
  97.                         var booker1:Booker=new Booker("booker1");
  98.                         var booker2:Booker=new Booker("booker2");
  99.                         var booker3:Booker=new Booker("booker3");
  100.                         //实例化一个信息中心
  101.                         var messageCenter:MessageCenter=new MessageCenter();
  102.                         //这三个用户需要订阅,找信息中心办理了订阅手续
  103.                         messageCenter.book(booker1);
  104.                         messageCenter.book(booker2);
  105.                         messageCenter.book(booker3);
  106.                         //信息中心给他们发送信息;
  107.                         messageCenter.send();
  108.                         //第一用户觉得信息没什么用,于是找信息中心办理了退订手续
  109.                         messageCenter.unbook(booker1);
  110.                                                //信息中心只给booker2,booker3发送信息了
  111.                         messageCenter.send();
  112.                                                
  113.                          
  114.                 }
  115.         }
  116. }
  117. 输出:
  118. [trace] booker1收到消息:message  from messageCenter
  119. [trace] booker2收到消息:message  from messageCenter
  120. [trace] booker3收到消息:message  from messageCenter
  121. [trace] booker2收到消息:message  from messageCenter
  122. [trace] booker3收到消息:message  from messageCenter
复制代码

[[i] 本帖最后由 kenjor01 于 2008-3-17 02:46 编辑 ]

com.rar

1.82 KB, 下载次数: 468

评分

参与人数 1威望 +2 收起 理由
enc0717 + 2 原创内容

查看全部评分

 楼主| 发表于 2008-3-17 22:45:09 | 显示全部楼层
请版主帮我把前面的那个装饰者模式改个标题:【设计模式】-1 装饰者模式 AS3http://bbs.blueidea.com/thread-2836210-1-2.html
回复 支持 反对

使用道具 举报

发表于 2008-3-18 10:24:28 | 显示全部楼层
就这样贴些代码有意义吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-3-18 11:37:55 | 显示全部楼层
你要是能体会得到代码中的含义,他就有意义,你要是体会不到,那就没有意义。
不过,还有你怀疑的很好。以后发之前我会写上些“有意义的话”先。

[[i] 本帖最后由 kenjor01 于 2008-3-18 11:41 编辑 ]
回复 支持 反对

使用道具 举报

发表于 2008-3-18 12:03:40 | 显示全部楼层
代码只是工具,要是我们连用处还没弄懂,那就只是一串字符串了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-3-18 12:21:47 | 显示全部楼层
楼上兄台,你要是让我举一下例子,说实话,我可能也弄不上来,毕竟手头做过的东西甚少啊。抱歉了。不过真是谢谢你捧场子。如果以后我发现什么地方用得上一定来补上。

这个例子跟书上介绍的有点不一样。书上介绍的是天气预报的应用,你可以翻翻书,上次的装饰者模式我按照书上的原例子,写了个as3的。这次我已经改进了,稍微运用了一下。而且我也说过了这个只是我的笔记或者是小练习。不敢....

还有,我补充一下,我觉得设计模式中的代码不是简单的工具,是一种思想。不知道我说的对不对?

[[i] 本帖最后由 kenjor01 于 2008-3-18 12:23 编辑 ]
回复 支持 反对

使用道具 举报

发表于 2008-3-18 12:39:30 | 显示全部楼层
谢谢楼主分享,我想问楼主一个问题,我想做一套自己的as3组件,需要全局控制所有组件的外观,样式,颜色什么的,应该使用什么样的设计模式或者架构?
回复 支持 反对

使用道具 举报

发表于 2008-3-18 12:41:01 | 显示全部楼层
楼主你说的两本书都有看过

要理解和运用Design Pattern,真不是简单事。

大家继续努力学习了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-3-18 12:43:49 | 显示全部楼层
也是,确实比较难啊。我现在就是把这些模式比较熟练的放在脑子里,以后要是用到,兴许能想起来。。呵呵!
blueidea中的潜伏高手真多哦。我这个菜鸟真是献丑了。
回复 支持 反对

使用道具 举报

发表于 2008-3-18 13:18:49 | 显示全部楼层
不错,支持!
思路、条理清晰!支持一个!
楼上有的人反问楼主是有道理的,楼主没有把什么叫观察者模式说清楚!应该什么样的情况使用。呵呵 ;-)
回复 支持 反对

使用道具 举报

发表于 2008-3-18 13:28:14 | 显示全部楼层
个人觉得as3的事件侦听机制就是一个Observer pattern ..

楼主怎么看..?
回复 支持 反对

使用道具 举报

发表于 2008-3-18 13:28:47 | 显示全部楼层
我就个人理解,观察者模式:即一对多的关系,就是一个实施者是主动的,若干被实施者是被动的,通俗点就是连锁反应。不管你是否愿意,强逼你接受,哈哈 和垃圾短信没区别

如:夜里一只猫大叫,老鼠发抖,吵醒了小孩,大人来哄小孩。 如果让你写个程序来描述这样的情况。而这时候“观察者模式”就最适合这样的场合使用了。这个情况猫是实施者,老鼠、小孩、大人都是被实施者。

[[i] 本帖最后由 ahui4367 于 2008-3-18 13:32 编辑 ]
回复 支持 反对

使用道具 举报

发表于 2008-3-18 13:30:46 | 显示全部楼层
as3的事件侦听机制就是一个Observer pattern
看上去像,如果仔细分析后就不是了。
回复 支持 反对

使用道具 举报

发表于 2008-3-18 13:34:12 | 显示全部楼层
原帖由 [i]ahui4367 于 2008-3-18 13:30 发表
as3的事件侦听机制就是一个Observer pattern
看上去像,如果仔细分析后就不是了。



愿闻其详 ,  谢谢
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-3-18 13:49:51 | 显示全部楼层
我个人感觉也是 addEventListener 就是征订 ,remove就是退订,不知道内部是怎么样的得问kingda他们,我知道kingda 对事件了解比较清晰.哪路高手能说说,我也愿闻其详!
楼上的语言丰富有趣哦,你来写教程肯定很好玩,不过那个老鼠什么的,毕竟没有老鼠不怕猫的!呵呵,开个玩笑!跟观察者模式有点区别。

[[i] 本帖最后由 kenjor01 于 2008-3-18 13:59 编辑 ]
回复 支持 反对

使用道具 举报

发表于 2008-3-18 14:25:01 | 显示全部楼层
回头看了下 刚才我说了不是,我考虑到有些情况是要用到代理的,as3的事件侦听机制原理 感觉是观察者模式.修正下.但是不是所有情况都适合的.
因为观察者模式实现的动力就- 代理和实践的合作成果. 为什么要用代理 没代理怎么传值呢.
我个人理解,不足之处.请指正,相互学习嘛.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-3-18 15:19:28 | 显示全部楼层
互相学习,as3 的事件涉及内核吗,还要请高手来说说,我感觉像是主持人了。哈哈
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-3-19 13:41:48 | 显示全部楼层
请问能帮我把kenjor 和kenjor01这个用户名合并为kenjor吗?前一个用户密码忘了!
回复 支持 反对

使用道具 举报

发表于 2008-3-19 13:57:38 | 显示全部楼层
AS3的内建的Event Model已经解决了Observer Pattern要解决的问题。
所以,在AS3中用好事件就是掌握了Observer Pattern。
因此,楼主的代码在AS3中应该用Event来写会更好。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-3-19 15:19:46 | 显示全部楼层
说的有理:
messageCenter.letItBook(booker1)

booker1.addEventListener(messageCennter),
这种形式把方向跌倒一下哦。
回复 支持 反对

使用道具 举报

发表于 2008-3-19 15:48:20 | 显示全部楼层
思路清晰。。。。。。。。。。
回复 支持 反对

使用道具 举报

发表于 2008-3-19 15:52:48 | 显示全部楼层
楼主能否推荐一下关于AS3设计模式的书籍?
我也想往这方面多努力努力哈!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-3-19 20:16:08 | 显示全部楼层
dengjie.com上有推荐!,我的网站上也有说明。不过没有degnjie上写的好
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|Archiver|手机版|blueidea.com ( 湘ICP备12001430号 )  

GMT+8, 2020-7-7 09:08 , Processed in 0.140269 second(s), 14 queries , Gzip On, Memcache On.

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表