您的位置:首页 > Web前端 > JavaScript

js发布——订阅模式

2017-01-20 19:41 288 查看
<h1>js发布——订阅模式</h1>
<p>发布—订阅模式幼教观察者模式,他定义对象间的一种一对多的依赖关系,当一个对象的状态发生变化时,所依赖于他的对象都将得到通知。
在javascript开发中,我们一般用事件模型来代替传统的发布-订阅模式。</p>
<p>发布-订阅示例:</p>
<script>
var salesOffices = {                 //定义售楼处
clientList: [],            	    //缓存列表,存放订阅者的回调函数
listen: function(fn){             //增加订阅者
this.clientList.push( fn );    //订阅的消息添加进缓存列表
},
trigger: function(){              //发布消息
for( var i = 0, fn; fn = this.clientList[ i++ ]; ){
fn.apply( this, arguments );
}
}
};

salesOffices.listen( function( price, squareMeter ){
console.log( "价格=" + price );
console.log( "squareMeter = " + squareMeter );
} );
salesOffices.listen( function( price, squareMeter ){
console.log( "价格=" + price );
console.log( "squareMeter = " + squareMeter );
} );
salesOffices.trigger( 200000, 88 );
</script>
<p>至此,我们已经实现了一个最简单的发布——订阅模式,但这里还存在一些问题,那就是订阅者接受到了发布者发布的每个消息,所以,我们
有必要加上一个标示key,让订阅者只阅读自己感兴趣的消息。改写代码如下:</p>
<script>
var salesOffice = {
clientList: {},

listen: function( key, fn ){
if( !this.clientList[ key ] ){
this.clientList[ key ] = [];
};
this.clientList[ key ].push( fn );
},

trigger: function(){
var key = Array.prototype.shift.call( arguments );

fns = this.clientList[ key ];
if( !fns || fns.length ===0 ){
return false;
};
for( var i = 0, fn; fn = fns[ i++ ]; ){
fn.apply( this, arguments );
}
}
};

salesOffice.listen( "squareMeter88", function( price ){
console.log( "价格 = " + price );
} );

salesOffice.listen( "squareMeter100", function( price ){
console.log( "价格 = " + price );
} );

salesOffice.trigger( "squareMeter88", 200000 );
salesOffice.trigger( "squareMeter100", 2000000 );
</script>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: