이 글에서는 게시-구독 및 관찰자 패턴을 소개하고 둘 사이의 차이점에 대해 설명합니다. 도움이 필요한 친구들이 모두 참고할 수 있기를 바랍니다.
얼마 전에 Promise를 구독 퍼블리싱 모델로 쓴 적이 있습니다. 제가 직장에서 개발하는 mobx도 관찰자 모델입니다. 둘 사이의 차이점에 대해 생각했습니다. 온라인의 차이점 분석은 혼란스럽습니다. 내 자신의 요약과 가장 간단한 구현(간단하기 때문에 이해하기 쉽습니다)을 모아서 두 가지에 대한 이해를 공유하고 심화해 보겠습니다.
arr 구독된 이벤트에 대한 캐시 센터 역할을 합니다
interface eventHub { arr: Array<Function>; on(fn: Function): void; emit(): void; } interface Person { age: number; name: string; } let eventHub: eventHub = { arr: [] as Array<Function>, // 订阅 on(fn: Function) { this.arr.push(fn); }, // 发布 emit() { this.arr.forEach((fn) => fn()); }, }; let person: Person = {} as Person; eventHub.on(() => { //订阅的事件里判断当 person长度为2时 打印person, if (Object.keys(person).length == 2) { console.log(person); } }); setTimeout(function () { person.age = 27; //发布的时候去遍历 this.arr 并执行第一次 eventHub.emit(); }, 10); setTimeout(function () { person.name = "Zoe"; //发布的时候去遍历 this.arr 并执行第二次 eventHub.emit(); }, 20);
두 번이나 퍼블리싱했지만 결국 외부 조건으로 인해 on에 있는 콘솔은 한 번만 실행되었습니다
관찰자 모드
관찰자와 관찰자가 관련되어 있습니다. (내부적으로 게시 및 구독 모델 기반)
// 被观察者 class Subject { name: string; //实例上定义一个name属性 state: string; observers: any[]; constructor(name:string) { this.name = name; this.observers = []; this.state = ""; } attach(o) { //传入观察者 this.observers.push(o); } setState(newState) { this.state = newState; this.observers.forEach((o) => o.update(this)); } } // 观察者 class Observer { name: string; constructor(name) { this.name = name; } update(interviewee) { console.log(`${interviewee.name} say to: ${this.name} ZOE的${interviewee.state}`); } } let hr = new Subject("HR"); let observer1 = new Observer("内推者"); let observer2 = new Observer("面试者"); hr.attach(observer1); hr.attach(observer2); hr.setState("面试通过了"); // baby.setState("面试没通过");
3. 구현 결과
둘의 차이점
위 내용은 게시, 구독 및 관찰자 패턴에 대해 간략하게 설명하고 둘 사이의 차이점에 대해 이야기해 보겠습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!