观察者模式(Observer Pattern)是一种常用的设计模式,用于在对象之间建立一种一对多的依赖关系。当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知并自动更新。对于这位刚入行的小白开发者来说,理解和实现观察者模式可能是一个挑战。在本文中,我将向他解释观察者模式的流程,并提供实现观察者模式所需的代码示例。
观察者模式的流程
观察者模式包含以下几个角色:
- Subject(主题):定义了观察者需要观察的对象,并提供了注册、取消注册观察者以及通知观察者的方法。
- Observer(观察者):定义了接收主题通知的方法。
- ConcreteSubject(具体主题):继承自Subject,实现了注册、取消注册观察者以及通知观察者的方法,并维护了一个观察者列表。
- ConcreteObserver(具体观察者):继承自Observer,实现了接收主题通知的方法。
下面是观察者模式的流程示意图:
classDiagram
class Subject {
+ attach(observer: Observer): void
+ detach(observer: Observer): void
+ notify(): void
}
class Observer {
+ update(): void
}
class ConcreteSubject {
- observers: Observer[]
+ attach(observer: Observer): void
+ detach(observer: Observer): void
+ notify(): void
}
class ConcreteObserver {
+ update(): void
}
Subject <|-- ConcreteSubject
Observer <|-- ConcreteObserver
实现观察者模式的步骤
下面是实现观察者模式的步骤:
步骤 | 代码 | 描述 |
---|---|---|
1 | interface Subject { <br>attach(observer: Observer): void; <br>detach(observer: Observer): void; <br>notify(): void; <br>} <br><br>interface Observer { <br>update(): void; <br>} |
创建Subject和Observer接口,定义了主题和观察者的方法。 |
2 | class ConcreteSubject implements Subject { <br>private observers: Observer[] = []; <br><br>attach(observer: Observer): void { <br>this.observers.push(observer); <br>} <br><br>detach(observer: Observer): void { <br>const index = this.observers.indexOf(observer); <br>if (index !== -1) { <br>this.observers.splice(index, 1); <br>} <br>} <br><br>notify(): void { <br>for (const observer of this.observers) { <br>observer.update(); <br>} <br>} <br>} |
创建ConcreteSubject类,继承自Subject接口,并实现了注册、取消注册观察者以及通知观察者的方法。 |
3 | class ConcreteObserver implements Observer { <br>update(): void { <br>// 实现观察者的更新逻辑 <br>} <br>} |
创建ConcreteObserver类,继承自Observer接口,并实现了接收主题通知的方法。 |
完整代码示例
下面是完整的代码示例:
// Step 1
interface Subject {
attach(observer: Observer): void;
detach(observer: Observer): void;
notify(): void;
}
interface Observer {
update(): void;
}
// Step 2
class ConcreteSubject implements Subject {
private observers: Observer[] = [];
attach(observer: Observer): void {
this.observers.push(observer);
}
detach(observer: Observer): void {
const index = this.observers.indexOf(observer);
if (index !== -1) {
this.observers.splice(index, 1);
}
}
notify(): void {
for (const observer of this.observers) {
observer.update();
}
}
}
// Step 3
class ConcreteObserver implements Observer {
update(): void {
// 实现观察者的更新逻辑
}
}
在这个示例中,我们创建了Subject接口和Observer接口