打印

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

今天来介绍一下第二个模式:观察者模式。还是看源代码吧。里面有介绍
详情请点击这里:
一再强调,本人水平有限,学习这个只是无聊而已,并非达到很高的水平。还望路过的高手海涵。
请版主帮我把前面的那个装饰者模式改个标题:【设计模式】-1 装饰者模式 AS3http://bbs.blueidea.com/thread-2836210-1-2.html

源代码也可以到作者网站下载http://www.kenjor.com
复制内容到剪贴板
代码:
//-----------------------------------------------//第一个文件  信息中心的接口
package com.dp.Observer {
    import com.dp.Observer.Booker;    
    /**
     * @author www.kenjor.com
     */
    public interface IMessageCenter {
//订阅 参数为订阅者
        function book(bo : Booker) : void;
        //退订 参数为订阅者
        function unbook(bo : Booker) : void;
        //派遣、发布
        function send() : void;
    }
}
//-----------------------------------------------
//第二个文件 订阅者接口
package com.dp.Observer {
    /**
     * @author www.kenjor.com
     */
    public interface IBooker {
        //我的信箱,邮递员投递信息的邮箱,他把信息扔到你的”updata”这个信箱里。
        function update(str : String) : void;
        
    }
}
//------------------------------------------------
//第三个文件 订阅者
package com.dp.Observer {
    import com.dp.Observer.IBooker;
    
    /**
     * @author www.kenjor.com
     */
    public class Booker implements IBooker {
        //订阅者的用户名
        private var _name:String;
        public function Booker(name:String){
            //初始化时候定义用户名
            _name=name;
        }
        public function update(str : String) : void {
            //str为收到的信息
            trace(_name+"收到消息:"+str);
        }
    }
}
//-----------------------------------------------
//第四个文件 信息发布中心
package com.dp.Observer {
    import com.dp.Observer.IMessageCenter;
    /**
     * @author www.kenjor.com
     */
    public class MessageCenter implements IMessageCenter {
        private var mess : String = new String("message  from messageCenter");
        private  var bookers_arr : Array = new Array();
        public function MessageCenter() {
        }
                    //订阅
        public function book(bo : Booker) : void {
                                  //如果在订阅者群体(bookers_arr)中不存这个订阅者(bo),就把这个订阅
                                 //者加入到订阅者群体中
                                               if (bookers_arr.indexOf(bo) < 0) {
                bookers_arr.push(bo);
            }
            ;
        }
                    //退订
        public function unbook(bo : Booker) : void {
            //在订阅者群体中找到这个订阅者,然后帮他办理退订业务
            var b_index : int = bookers_arr.indexOf(bo);
            if(b_index >= 0) {
                bookers_arr.splice(b_index, 1);
            }
        }
        public function send() : void {
            //给订阅者群体中的每个订阅者发送信息(报刊)
            var bookers_len : Number = bookers_arr.length;
            for(var i : Number = 0;i < bookers_len;i++) {
                bookers_arr[i].update(mess);
            }
        }
    }
}
//-----------------------------------------------
//第五个文件  主文件 运行它
package com.dp.Observer {
    import flash.display.Sprite;
    /**
     * @author www.kenjor.com
     */
    public class Main extends Sprite {
        public function Main() {
            //实例化三个用户booker1,booker2,booker3
            var booker1:Booker=new Booker("booker1");
            var booker2:Booker=new Booker("booker2");
            var booker3:Booker=new Booker("booker3");
            //实例化一个信息中心
            var messageCenter:MessageCenter=new MessageCenter();
            //这三个用户需要订阅,找信息中心办理了订阅手续
            messageCenter.book(booker1);
            messageCenter.book(booker2);
            messageCenter.book(booker3);
            //信息中心给他们发送信息;
            messageCenter.send();
            //第一用户觉得信息没什么用,于是找信息中心办理了退订手续
            messageCenter.unbook(booker1);
                                               //信息中心只给booker2,booker3发送信息了
            messageCenter.send();
                        
            
        }
    }
}
输出:
[trace] booker1收到消息:message  from messageCenter
[trace] booker2收到消息:message  from messageCenter
[trace] booker3收到消息:message  from messageCenter
[trace] booker2收到消息:message  from messageCenter
[trace] booker3收到消息:message  from messageCenter
[ 本帖最后由 kenjor01 于 2008-3-17 02:46 编辑 ]
附件: 您所在的用户组无法下载或查看附件,您需要注册/登录后才能查看!
本帖最近评分记录
  • enc0717 威望 +2 原创内容 2008-3-17 22:29
快乐每一天!
请版主帮我把前面的那个装饰者模式改个标题:【设计模式】-1 装饰者模式 AS3http://bbs.blueidea.com/thread-2836210-1-2.html
快乐每一天!
就这样贴些代码有意义吗?
你要是能体会得到代码中的含义,他就有意义,你要是体会不到,那就没有意义。
不过,还有你怀疑的很好。以后发之前我会写上些“有意义的话”先。

[ 本帖最后由 kenjor01 于 2008-3-18 11:41 编辑 ]
快乐每一天!

TOP

还在为头像烦恼?还在为不能关注好友动态烦忧?快来蓝色理想家园吧!
代码只是工具,要是我们连用处还没弄懂,那就只是一串字符串了

TOP

楼上兄台,你要是让我举一下例子,说实话,我可能也弄不上来,毕竟手头做过的东西甚少啊。抱歉了。不过真是谢谢你捧场子。如果以后我发现什么地方用得上一定来补上。

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

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

[ 本帖最后由 kenjor01 于 2008-3-18 12:23 编辑 ]
快乐每一天!

TOP

谢谢楼主分享,我想问楼主一个问题,我想做一套自己的as3组件,需要全局控制所有组件的外观,样式,颜色什么的,应该使用什么样的设计模式或者架构?

TOP

楼主你说的两本书都有看过

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

大家继续努力学习了

TOP

也是,确实比较难啊。我现在就是把这些模式比较熟练的放在脑子里,以后要是用到,兴许能想起来。。呵呵!
blueidea中的潜伏高手真多哦。我这个菜鸟真是献丑了。
快乐每一天!

TOP

不错,支持!
思路、条理清晰!支持一个!
楼上有的人反问楼主是有道理的,楼主没有把什么叫观察者模式说清楚!应该什么样的情况使用。呵呵 ;-)

TOP

个人觉得as3的事件侦听机制就是一个Observer pattern ..

楼主怎么看..?
个人网站

TOP

我就个人理解,观察者模式:即一对多的关系,就是一个实施者是主动的,若干被实施者是被动的,通俗点就是连锁反应。不管你是否愿意,强逼你接受,哈哈 和垃圾短信没区别

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

[ 本帖最后由 ahui4367 于 2008-3-18 13:32 编辑 ]

TOP

as3的事件侦听机制就是一个Observer pattern
看上去像,如果仔细分析后就不是了。

TOP

引用:
原帖由 ahui4367 于 2008-3-18 13:30 发表
as3的事件侦听机制就是一个Observer pattern
看上去像,如果仔细分析后就不是了。
愿闻其详 ,  谢谢
个人网站

TOP

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

[ 本帖最后由 kenjor01 于 2008-3-18 13:59 编辑 ]
快乐每一天!

TOP

回头看了下 刚才我说了不是,我考虑到有些情况是要用到代理的,as3的事件侦听机制原理 感觉是观察者模式.修正下.但是不是所有情况都适合的.
因为观察者模式实现的动力就- 代理和实践的合作成果. 为什么要用代理 没代理怎么传值呢.
我个人理解,不足之处.请指正,相互学习嘛.

TOP

互相学习,as3 的事件涉及内核吗,还要请高手来说说,我感觉像是主持人了。哈哈
快乐每一天!

TOP

请问能帮我把kenjor 和kenjor01这个用户名合并为kenjor吗?前一个用户密码忘了!
快乐每一天!

TOP

AS3的内建的Event Model已经解决了Observer Pattern要解决的问题。
所以,在AS3中用好事件就是掌握了Observer Pattern。
因此,楼主的代码在AS3中应该用Event来写会更好。

TOP

说的有理:
messageCenter.letItBook(booker1)

booker1.addEventListener(messageCennter),
这种形式把方向跌倒一下哦。
快乐每一天!

TOP

思路清晰。。。。。。。。。。

TOP

楼主能否推荐一下关于AS3设计模式的书籍?
我也想往这方面多努力努力哈!
咱水区牛人可真多啊!俺也想成牛人!

TOP

dengjie.com上有推荐!,我的网站上也有说明。不过没有degnjie上写的好
快乐每一天!

TOP