[架构]事件机制--典型观察者模式

本文介绍了观察者模式如何实现松耦合,重点讨论了CustomEvent在事件封装中的作用,允许用户自定义事件以增强系统间的解耦。文章详细讲解了事件管理的三个核心部分:addListener用于添加事件句柄,fire用于触发事件,removeListener用于移除事件。在fire方法中,事件参数被转换为包含type和可选target的对象,并依次执行句柄。同时,文章还提及了事件驱动处理库和Cocos2d-x Lua的自定义事件分发系统。
摘要由CSDN通过智能技术生成

程序设计的正确标准是松耦合,高内聚. 而观察者模式恰恰给松耦合提供了便利条件. CustomEvent又是对事件的高度封装.是用户能够自定义自己的事件. 从而达到更好的松耦合.简单的自定义事件:

function EventTarget() {
    this._listeners = {};
};

EventTarget.prototype = {
    constructor: EventTarget,
    addListener: function(type, listener) {
        if(typeof this._listeners[type] == 'undefined') {
            this._listeners[type] = [];
        }
        this._listeners[type].push(listener);
    },
    fire: function(event) {
        if(typeof event == 'string') {
            event = { type: event};
        }
        if(!event.target) {
            event.target = this;
        }
        if(!event.type) {
            throw new Error('Event Object missing type property');
        }
        if(this._listeners[event.type] instanceof Array) {
            var listeners = this._listeners[event.type];
            for(var i = 0, len = listeners.length; i < len; i++) {
                listeners[i].call(this, event);
            }
        }
    },
    removeListener: function(type, listener) {
        if(this._listeners[type] instanceof Array) {
            var listeners = this._listeners[type];
            for(var i = 0, len = listeners.length;i < len; i++) {
                if(listeners[i] === listener) {
                    listeners.splice(i, 1);
                    break;
                }
            }
        }
    }
};

//var target = new EventTarget();
//function handleEvent(event) {
    //alert(event.target);
//};

//target.addListener('foo', handleEvent);
//target.fire({type:'foo', target:'wasai'});
//target.removeListener('foo', handleEvent)
//target.fire({type:'foo', target:'wasai'});

function MyObject() {
    EventTarget.call(this);
}
MyObject.prototype = new EventTarget();
MyObject.prototype.constructor = MyObject;

MyObject.prototype.foo = function() {
    this.fire('foo');
}
var o = new MyObject();
o.addListener('foo', function() {
    alert('Foo Just happend');
})
o.foo();

上面代码主要分为三部分

addListener(添加事件句柄)

首先初始化的时候维护一个_listeners的Hash列表. 当追加自定义事件的时候.如果该事件没有追加过即undefined那么就创建一个数组列表用来存放事件句柄.否则如果已经存在那么就继续push到这个句柄存放数组中.

 

fire(触发事件)

如果event参数是string类型 那么给赋值为具有type属性的对象. 如果不存在target那么再往对象上添加target属性.并指向事件管理器. 然后获取当前事件数组里存放的所有句柄.循环执行.并将scope指向时间管理器.

 

removeListener(移除事件)

获取指定type的事件对象的句柄数组.循环这个数组.然后和指定的事件句柄函数做比较.如果找到了对应的事件句柄.那么就将这个事件句柄从数组中移除.
 

事件驱动处理库:select,poll,epoll,libev

[cocos2dx_lua]Lua版自定义事件分发系统

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值