设计模式学习篇-观察者模式

37 阅读1分钟

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();