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被从新赋值后以前的监听也会丢失。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的地方但愿你们能够留言指正,我会尽快修改。继承

相关文章
相关标签/搜索