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被從新賦值後以前的監聽也會丟失。git
TestModel testModel = TestModel.GetInsatance(); testModel.count.Set(11);
對於ObservableData,直接經過Set(T data),Get()函數進行數據的修改和獲取,在修改的同時會發送修改事件出去。github
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,使用方法與單數據相似。this
爲了提升ObservableData的易用性,添加了AssistantBinder、ObserverView。
AssistantBinder: 輔助綁定類,做爲一個額外的holder,可對數據和監聽進行統一的管理。
ObserverView: 繼承自MonoBehaviour,在被銷燬時自動對監聽進行釋放。設計
整合了數據的存儲和事件的通知,化簡了觀察者模式。
1.易於擴展:
添加新類型時只用添加新的ObservableData和DataListener便可。
2.易於修改:
好比在某些項目修改數據時但願通知出不一樣的事件,能夠直接修改對應的Set、Get函數。code
項目連接:ObservableDemoserver
有什麼設計不合理或者有bug的地方但願你們能夠留言指正,我會盡快修改。繼承