ObservableData-另一種姿勢的觀察者模式
使用
資料的定義
public class TestModel { private static TestModel mInstance; public static TestModel GetInsatance() { if (mInstance == null) mInstance = new TestModel(); return mInstance; } readonly public ObservableData<int> num = new ObservableData<int>(); }
直接定義在Model中即可,在定義時建議直接定義成readonly,防止出現ObservableData被重新賦值,因為監聽都是繫結在ObservableData上的,ObservableData被重新賦值後之前的監聽也會丟失。
資料的修改
TestModel testModel = TestModel.GetInsatance();
testModel.count.Set(11);
對於ObservableData
資料的監聽與監聽的移除
using UnityEngine; public class TestObserver : MonoBehaviour { void Awake() { TestModel testModel = TestModel.GetInstance(); testModel.count.AddListener(TestListener,DataListenerType.UPDATE,this); } void TestListener(int num) { Debug.Log(num); } void OnDestroy() { testModel.count.RemoveListener(TestListener); } }
監聽
直接向對應的ObservableData新增監聽、監聽型別、holder即可(holder代表這個監聽被哪個例項持有,便於監聽的移除)。
新增監聽後,在修改ObservableData時,就會對對應型別的監聽進行呼叫。
移除監聽
通過監聽的委託或holder移除一個監聽或所有監聽。
核心思路
1.使用泛型將型別封裝,在修改資料的同時根據修改的型別通知事件出去。
2.使用泛型將監聽的回撥封裝,可以進行統一的監聽和移除。
3.通過輔助繫結類等輔助類增加ObservableData的易用性。
4.在單資料的ObservableData還增加了List型別的Data,使用方法與單資料類似。
其他
為了提高ObservableData的易用性,添加了AssistantBinder、ObserverView。
AssistantBinder: 輔助繫結類,作為一個額外的holder,可對資料和監聽進行統一的管理。
ObserverView: 繼承自MonoBehaviour,在被銷燬時自動對監聽進行釋放。
小結
整合和資料的儲存和事件的通知,化簡了觀察者模式。
1.易於擴充套件:
新增新型別時只用新增新的ObservableData和DataListener即可。
2.易於修改:
比如在某些專案修改操作希望通知出不同的事件,可以直接修改對應的Set、Get函式。
專案連結:ObservableDemo
有什麼設計不合理或者有bug的地方希望大家可以留言指正,我會盡快修改。