本篇文章為大家介紹一下發布訂閱和觀察者模式,聊聊兩者的差異。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。
前段時間心血來潮自己寫一一個promise, promise剛好就是訂閱發布模式,工作中開發用的mobx 整體又是觀察者模式,雖然都用,但一直沒去細想兩者的差異,網路上的差別分析看的雲裡霧裡。結合一下整理一篇自己的總結和最簡單實現(也因為簡單所以也很好理解)做個分享同時加深自己對這兩者的理解
#1、實現想法
2、程式碼實作
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);
#3、結果
雖然發布了兩次但最終on 裡的console因為外部條件只執行了一次
1、實現想法
與觀察者模式類似,但需要分一個觀察者,和被觀察者
2、程式碼實作
// 被观察者 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中文網其他相關文章!