导航

  • 首页
  • Tags列表
  • 管理
  • 简繁转换
Search Engine Optimization 站外搜索 站内搜索
« 由google付费而想到的生活小窍门(3) »

基于事件的程序设计

"基于时间的程序设计向基于事件的程序设计时,存在一个责任的转换。在基于事件的程序设计中,你不需要再持续检查新的事件,而是通知另外一个对象订阅该事件,这个对象称为事件源,你是监听器,负责监听来自事件源的事件。"这一段话是书中的原话,书中用出版社和读者这两者的关系来说明事件源和监听者之间的关系:一读者订阅了杂志社的某种杂志,基于时间的程序设计来处理这一事件时,读者就必须每间隔一段时间就要跑去杂志社查询这本杂志是否已经出版,在flash中的表现形式为:
this.onEnterFrame=function (){
if(已经出版){
购买;
delete this.onEnterFrame;
}
else
继续等待;
}
当用基于事件的程序设计来处理这两者之间的关系时,读者只需要在家等待来自出版社的通知就行了,如果书已经出版,出版社给你打电话发出通知:“书已经出版了,你过来买一下。”然后你就出发去购买,这样你的就不必要每间隔一段时间就要跑去杂志社查询。这里出版社就是事件源,你就是监听者,监听来至出版社的“购买”事件。
我们要广播自已的事件就必须要用到AsBrosdcaster对象,在flash mx 中此对象是ASBrosdcaster,还是个隐藏对象,开始还已为此方法在2004版本中给拿掉了,用书中的另一隐藏对象ASSetPropFlags遍历_global对象发现变是大"S"变成小"s"了:)
任何一个自定义对象想要成为事件源,就必需要有这_listeners(一个数组,用来存储监听者对象的列表),removeListener(方法,删除监听者),addListener(方法,增加监听者),broadcasMessage(方法,广播事件)4个关键的事件源特征。要用AsBrosdcaster对象的initialize方法初始化自定义对象后,自定义对象就能富含这四个关键特征。更改之后的NewsFeed类:
NewsFeed.as

class NewsFeed
{
/*下面的三个方法在AS2.0中在使用前还必须要进行声明,(感谢blueidea中坛友noahgenius
的提醒)不然无法使用,在AS1.0中不需要,实在是不理解MM要多此一举*/
var addListener : Function;
var removeListener : Function;
var broadcastMessage : Function;
var name : String;
function NewsFeed (name)
{
this.name = name;
AsBroadcaster.initialize (this);
addListener (this);
}
function toString () : String
{
return this.name;
}
function sendNews (headline : String, summary : String, url : String) : Void
{
broadcastMessage ("onNews", this, headline, summary, url);
}

一个实例(书中的原码,是AS1.0,但在AS2.0中一样编译通过):

natPress = new NewsFeed ("National Press");

NABC = new Object();
AICN = new Object();

NABC.onNews = function (source, headline, summary, url) {
trace ("----- NABC News -----");
trace (">" + headline + "<");
trace (summary);
trace (">>" + url);
trace ("[via" + source +"]");
trace ("--");
};

AICN.onNews = function (source, headline, summary, url) {
trace ("///// Ain't It Crazy News /////");
trace ("Unbelievable!!");
trace (headline + "!!!");
trace (source + " reports: '" + summary + "'");
trace ("Read the rest of the incredible story here:");
trace (url);
trace ("//");
};

natPress.addListener (NABC);
natPress.addListener (AICN);
trace (natPress._listeners); // output: [object Object],[object Object]

natPress.sendNews ( "Marcosoft buys Murkimedia",
"After months of secret negotiations, Marcosoft absorbs its chief rival",
"http://www.marcosoft.com" )

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Search



  • 互联网 站内搜索

最新留言

最近发表

站点统计

  • 文章总数:244
  • 评论总数:246
  • 引用总数:0
  • 浏览总数:380993
  • 当前样式:default
  • 当前语言:zh-CN

图标汇集

  • 订阅到抓虾
    新闻蚂蚁
    周博通
    订阅到狗狗
    google reader
    bloglines
    my yahoo
    newsgator
    netvibes
    Rojo
  • 通过 W3C XHTML 1.0 Transitional 校验
  • 通过 W3C CSS 校验
  • 订阅本站的 ATOM 1.0 新闻聚合
  • 订阅本站的 RSS 2.0 新闻聚合

Powered By Z-Blog 1.6 Final Build 60802

Copyright Yufuzi Some Rights Reserved.
E-mail:yufuzi80@126.com QQ:20168130
备案序号:苏ICP备06015492号