观察者模式
class Observer {
private name: string;
public fn: (state: string) => void;
constructor(name: string, fn: (state: string) => void) {
this.name = name;
this.fn = fn;
}
}
class Subject {
private state: string;
private observers: Observer[];
constructor(state: string) {
this.state = state;
this.observers = [];
}
setState(state: string) {
this.state = state;
this.observers.forEach((item: Observer) => {
item.fn(this.state);
});
}
addObserver(obs: Observer) {
this.observers = this.observers.filter(
(item: Observer) => item !== obs
);
this.observers.push(obs);
}
removeObserver(obs: Observer) {
this.observers = this.observers.filter(
(item: Observer) => item !== obs
);
}
}
const xiaozhang: Observer = new Observer("校长", (state) => {
console.log(`因为${state},校长`);
});
const laoshi: Observer = new Observer("老师", (state) => {
console.log(`因为${state},老师`);
});
const xiaoming: Subject = new Subject("学习");
xiaoming.addObserver(xiaozhang);
xiaoming.addObserver(laoshi);
xiaoming.setState("玩游戏");
发布订阅模式
type Hander = {
[key: string]: Function[];
};
class Observer {
public message: Hander;
constructor() {
this.message = {};
}
public on(type: string, fn: () => void) {
if (!this.message[type]) {
this.message[type] = [];
}
this.message[type].push(fn);
}
public off(type: string, fn?: () => void) {
if (!fn) {
delete this.message[type];
return;
}
if (!this.message[type]) return;
this.message[type] = this.message[type].filter(
(item: Function) => item !== fn
);
}
public emit(type: string) {
if (!this.message[type]) return;
this.message[type].forEach((item: Function) => item());
}
}
const p = new Observer();
p.on("a", handerA);
p.on("a", handerB);
p.off("a");
p.off("a", handerA);
p.emit("a");
function handerA() {
console.log("a");
}
function handerB() {
console.log("b");
}