【序】(该系列为阅读公众号的读后感,对原公众号有剪辑工作,批注,学习的再加工,希望读者可以通过后面的原文地址进行阅读)昨天学习到了工厂模式确实拓宽了思路,用从express源码中学习到的知识在今天的coding当中就解决了一个之前因为没有优雅解决方案困扰的问题,因此在学习方面不能间断,继续加油,既然设计模式如此有用,那么今天就继续学习订阅者*模式吧,原文链接
问题一
- 【疑惑】什么是订阅者模式?
- 【解惑】订阅者模式,首先从对象拆分,分为主题(Subject)订阅者(Observer),主题发布后,会一一通知订阅者。
- 【实现】
- 创建主题
【关键】
- 要创建一个观察者队列,添加/删除观察者的方法,通知观察者的方法
- 调用主题的通知方法时,循环调用观察者的消息方法
- 在调用时去添加观察者
class Subject {
private observers: Observer[] = [];
public addObserver(observer: Observer): void {
console.log(observer, "is pushed!");
this.observers.push(observer);
}
public deleteObserver(observer: Observer): void {
console.log("remove", observer);
const n: number = this.observers.indexOf(observer);
n != -1 && this.observers.splice(n, 1);
}
public notifyObservers(): void {
console.log("notify all the observers", this.observers);
this.observers.forEach(observer => observer.notify());
}
}
- 创建观察者类
interface Observer {
notify: Function;
}
class ConcreteObserver implements Observer {
constructor(private name: string) { }
notify() {
console.log(`${this.name} has been notified.`);
}
}
- 调用
function show(): void {
const subject: Subject = new Subject();
subject.addObserver(
new ConcreteObserver(
"Semlinker"
));
subject.addObserver
(
new ConcreteObserver(
"Kakuqo"
));
subject.notifyObservers();
subject.deleteObserver(
new ConcreteObserver(
"Lolo"
));
subject.notifyObservers();
}
- 【优点】
- 自动通知所有观察者
- 两者是在调用阶段才进行耦合的,要扩展和维护也很方便
- 【缺点】
- 使用队列遍历的方式通知,一旦观察者过多将会增加耗时
- 一旦观察者与主题之间有耦合关系,就会出现循环调用,系统崩溃
- 【使用场景】
当一个对象的行为依赖另外一个对象的状态时
【总结】
观察者模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。该模式主要解决一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。
网友评论