1.概念
观察者模式也被称为发布订阅模式.在对象之间定义一个一对多的依赖,当一个对象状态改变的时候,所有依赖的对象都会自动收到通知。一般情况下,被依赖的对象叫作被观察者(Observable),依赖的对象叫作观察者 (Observer),此模式使用非常广泛。
2.为什么使用
为了解耦代码,或者解耦系统等等
3.应用场景
在游戏开发中,事件系统一般都是采用这种模式开发
// 观察者
interface IObserver {
update: () => void
}
// 被观察者
interface ISubject {
addObserver: (observer: IObserver) => void
removeObserver: (observer: IObserver) => void
notifyObserver: () => void
}
class Subject implements ISubject {
private _observers: IObserver[] = []
public get observers(): IObserver[] {
return this._observers
}
public set observers(value: IObserver[]) {
this._observers = value
}
addObserver(observer: IObserver) {
this.observers.push(observer)
}
removeObserver(observer: IObserver) {
const index = this.observers.indexOf(observer)
if (index !== -1) {
this.observers.splice(index, 1)
}
}
notifyObserver() {
this.observers.forEach(observer => {
observer.update()
});
}
}
class MainRole implements IObserver {
private _index: number = 0
constructor(index: number) {
this._index = index;
}
update() {
console.log(`主角${this._index}攻击`);
}
}
class Monster implements IObserver {
update() {
console.log('怪物攻击')
}
}
let m1 = new MainRole(1);
let m2 = new MainRole(2);
let sub = new Subject();
sub.addObserver(m1);
sub.addObserver(m2);
sub.notifyObserver();
sub.removeObserver(m1);
sub.removeObserver(m2);
let enemy = new Monster();
sub.addObserver(enemy);
sub.notifyObserver();