观察者模式Observer Pattern
是一种对象行为型模式,当定义的对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新,观察者模式又叫做发布-订阅Publish - Subscribe
模式、模型-视图Model - View
模式、源-监听器Source - Listener
模式或从属者Dependents
模式。
观察者模式建立了一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应做出反应。所以发生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应多个观察者,而且这些观察者之间没有相互联系,可以根据需要增加和删除观察者,使得系统更易于扩展。
A
对象的行为将影响B对象,B
对象的行为将影响C
对象……
,可以使用观察者模式创建一种链式触发机制。class PubSub{ // 订阅-发布类
constructor(){
this.handlers = {};
}
on(key, handler) { // 订阅
if (!(key in this.handlers)) this.handlers[key] = [];
this.handlers[key].push(handler);
}
off(key, handler) { // 卸载
const index = this.handlers[key].findIndex(item => item === handler);
if (index < 0) return false;
if (this.handlers[key].length === 1) delete this.handlers[key];
else this.handlers[key].splice(index, 1);
return true;
}
commit(key, ...args) { // 触发
if (!this.handlers[key]) return false;
this.handlers[key].forEach(handler => handler.apply(this, args));
return true;
}
}
const eventBus = new PubSub();
/**
求职者订阅了一些招聘网站,只要有匹配的工作机会,他们就会得到通知
*/
class JobBoard{ // 招聘公告板
subscribe(funct) {
eventBus.on("job-sub", funct);
}
notify(){
eventBus.commit("job-sub");
}
}
class JobSeeker { // 求职者
constructor(name) {
this._name = name;
}
notify() {
console.log(this._name, "has been notified of a new posting");
}
}
(function(){
var jonDoe = new JobSeeker("John Doe")
var janeDoe = new JobSeeker("Jane Doe")
var kaneDoe = new JobSeeker("Kane Doe")
var jobBoard = new JobBoard();
jobBoard.subscribe(() => jonDoe.notify());
jobBoard.subscribe(() => janeDoe.notify());
jobBoard.subscribe(() => kaneDoe.notify());
jobBoard.notify();
})();
https://github.com/WindrunnerMax/EveryDay
https://www.runoob.com/design-pattern/observer-pattern.html
https://github.com/sohamkamani/javascript-design-patterns-for-humans#-observer
https://design-patterns.readthedocs.io/zh_CN/latest/behavioral_patterns/observer.html
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。