// 观察者设计模式(发布订阅模式)
// 发布者
let shopObj = {};
// 商品列表
shopObj.list = [];
// 订阅方法 (根据用户的订阅进行用户分组)
shopObj.listen = function(key, fn) {
if(!this.list[key]) { // 如果没有 就给一个初始列表
this.list[key] = [];
}
shopObj.list[key].push(fn); // 往特定的商品列表中添加订阅
}
// 发布消息方法
shopObj.publish = function(key) {
let fns = this.list[key]; // 往特定的(某个商品)列表添加发布消息
for(let i=0, fn; fn = fns[i++];) {
// 执行订阅的fn arguments: js内置对象,存储所有的实参
fn.apply(this, arguments);
}
}
// A添加订阅
shopObj.listen('huawei', function(brand, model){
console.log(`A订阅: ${brand}的${model}`);
})
// B添加订阅
shopObj.listen('apple', function(brand, model){
console.log(`B订阅: ${brand}的${model}`);
})
// 商家发布消息
shopObj.publish('huawei', 'P30');
shopObj.publish('apple', 'iphone 12');
console