然而這種做法的缺點還是耦合度太大,過度依賴頁面進棧順序。一旦在以后的產(chǎn)品迭代中頁面順序發(fā)生變化,將很難去維護。
流程圖:
上述兩種方法都存在著耦合度大、維護困難的問題,而利用發(fā)布/訂閱模式能很好的實現(xiàn)解耦,下面我們先來了解一下這種設(shè)計模式。
發(fā)布/訂閱模式(最優(yōu)方案)
發(fā)布/訂閱模式由一個發(fā)布者、多個訂閱者以及一個調(diào)度中心所組成。訂閱者們先在調(diào)度中心訂閱某一事件并注冊相應(yīng)的回調(diào)函數(shù),當(dāng)某一時刻發(fā)布者發(fā)布了一個事件,調(diào)度中心會取出訂閱了該事件的訂閱者們所注冊的回調(diào)函數(shù)來執(zhí)行。
在發(fā)布/訂閱模式中,訂閱者和發(fā)布者并不需要關(guān)心對方的狀態(tài),訂閱者只管訂閱事件并注冊回調(diào)、發(fā)布者只管發(fā)布事件,其余一切交給調(diào)度中心來調(diào)度,從而能實現(xiàn)解耦。
在 app 跨頁面通信這個問題上,iOS 端的 Notification Center 、安卓端的 EventBus ,也是通過這樣一種設(shè)計模式去解決的,不過微信小程序內(nèi)部并沒有提供這種事件通知機制,所以我們需要手動去實現(xiàn)一個。
我們首先要實現(xiàn)一個 Event 類,它應(yīng)該含有一個收集回調(diào)函數(shù)的對象,和提供三個基礎(chǔ)方法:on(訂閱)、 emit(發(fā)布)、 off(注銷)。