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,直接通過Set(T data),Get()函數進行數據的修改和獲取,在修改的同時會發送修改事件出去。

數據的監聽與監聽的移除

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的地方希望大家可以留言指正,我會盡快修改。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM