什么是观察者模式?
- 观察者模式一种设计模式。
- 观察者模式定义了对象间的一种 一对多 的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知,并自动更新。
- 简单说明,在观察者模式中,有两个模型,一个观察者
(observer) 和一个被观察者(Observed) 。当被观察者发生改变或变化时,会通知观察者。
场景模拟
- 倘若即将到来双11,想要在双11购买商品的人就是观察者
(Observer) - 想要购买的商品就是被观察者
(Observed) - 为了更加形象,添加一个商家来改变商品的价格,商家也就是发布者
(Publish) - 当双11当天,商家(发布者
(Publish) )会修改商品(被观察者(Observed) )的价格,然后关注订阅该商品的人(观察者(Observer) )就会收到信息通知。
代码实现
var shopObj = {};
shopObj.list = [];
shopObj.listen = function ( key, fn) {
if (!this.list[key]) {
this.list[key] = [];
}
this.list[key].push(fn);
}
shopObj.publish = function (key) {
var fns = this.list[key];
for(var i = 0 ,fn; fn = fns[i++];){
fn.apply(this, arguments)
}
}
shopObj.listen("华为", function (brand, model) {
console.log( "A用户收到:" + brand + model + "手机降价了");
})
shopObj.listen("华为", function (brand, model) {
console.log("B用户收到:" + brand + model + "手机降价了");
})
shopObj.listen("小米", function (brand, model) {
console.log("C用户收到:" + brand + model + "手机降价了");
})
shopObj.publish("华为", "p30");
shopObj.publish("小米", "Mix4");
重构代码
var Eevent = {
list: [],
listen: function (key, fn) {
if (!this.list[key]) {
this.list[key] = [];
}
this.list[key].push(fn);
},
publish: function (key) {
var fns = this.list[key];
for (var i = 0, fn; fn = fns[i++];) {
fn.apply(this, arguments)
}
}
}
var initEvent = function (obj) {
for (var i in Eevent) {
obj[i] = Eevent[i];
}
}
var shopObj = {};
initEvent(shopObj);
shopObj.listen("华为", function (brand, model) {
console.log("A用户收到:" + brand + model + "手机降价了");
})
shopObj.listen("华为", function (brand, model) {
console.log("B用户收到:" + brand + model + "手机降价了");
})
shopObj.listen("小米", function (brand, model) {
console.log("C用户收到:" + brand + model + "手机降价了");
})
shopObj.publish("华为", "p30");
shopObj.publish("小米", "Mix4");
|