使用

数据的定义

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

ObservableData-另一种姿势的观察者模式的更多相关文章

  1. 快速了解IOC的几种姿势

    一.首先我们了解IOC如何注入的几种姿势 构造函数注入(Constructor Injection) Ioc容器会智能的选择和调用合适的构造函数以创建依赖的对象.如果被选择的构造函数具有相应的参数,I ...

  2. 两个文件去重的N种姿势

    最近利用shell帮公司优化挖掘关键词的流程,用shell替代了多个环节的操作,极大提高了工作效率. shell在文本处理上确有极大优势,比如多文本合并.去重等,但是最近遇到了一个难搞的问题,即两个大 ...

  3. 又拍云张聪:OpenResty 动态流控的几种姿势

    2019 年 1 月 12 日,由又拍云.OpenResty 中国社区主办的 OpenResty × Open Talk 全国巡回沙龙·深圳站圆满结束,又拍云首席架构师张聪在活动上做了< Ope ...

  4. 补习系列(7)-springboot 实现拦截的五种姿势

    目录 简介 姿势一.使用 Filter 接口 1. 注册 FilterRegistrationBean 2. @WebFilter 注解 姿势二.HanlderInterceptor 姿势三.@Exc ...

  5. python打开文件的N种姿势

    # python打开文件的N种姿势 print('[1]使用open()函数+简单for循环') f1 = open('python.txt') for line in f1: print(line. ...

  6. [转]地图投影的N种姿势

    此处直接给出原文链接: 1.地图投影的N种姿势 2.GIS理论(墨卡托投影.地理坐标系.地面分辨率.地图比例尺.Bing Maps Tile System)

  7. 【bzoj3224】Tyvj 1728 普通平衡树 01Trie姿势+平衡树的四种姿势 :splay,旋转Treap,非旋转Treap,替罪羊树

    直接上代码 正所谓 人傻自带大常数 平衡树的几种姿势:  AVL Red&Black_Tree 码量爆炸,不常用:SBT 出于各种原因,不常用. 常用: Treap 旋转 基于旋转操作和随机数 ...

  8. SpringBoot系列教程web篇Servlet 注册的四种姿势

    原文: 191122-SpringBoot系列教程web篇Servlet 注册的四种姿势 前面介绍了 java web 三要素中 filter 的使用指南与常见的易错事项,接下来我们来看一下 Serv ...

  9. python HelloWorld 的 4 种姿势,你知道几种

    安装完 Python 之后该干啥,当然是要 say HelloWorld 了. python.exe 就是个普通程序 和其它所有命令一样,在命令行中敲下 python 并回车的时候,操作系统去 PAT ...

随机推荐

  1. C/C++的内存泄漏检测工具Valgrind memcheck的使用经历

    Linux下的Valgrind真是利器啊(不知道Valgrind的请自觉查看参考文献(1)(2)),帮我找出了不少C++中的内存管理错误,前一阵子还在纠结为什么VS 2013下运行良好的程序到了Lin ...

  2. 将ubuntu14.04 从mysql从5.5删除之后安装5.7遇到的一些问题(本篇不讨论热升级)

    五一放假实在无聊 继续玩弄新的服务器.发现有台mysql版本实在有点老,估计是akiho直接使用 apt-get install mysql-server ,然后又没有更新到最新的源,然后无脑安装了5 ...

  3. 照片 GPS 信息查询

    照片 GPS 信息查询 经纬度查询 https://jingweidu.51240.com/ // 30.27832833333333, 120.01914111111111 30 + 16/60 + ...

  4. jmeter 参数化测试

    变量的值可以不改变,可以被定义一次,如果不使用,不会改变值. 在测试计划中,变量可以做为方便的频繁使用的表达式,或都作为在测试运行中的可能会改变的常量,例如 线程组中线程的数量.主机名称 在确定一个测 ...

  5. linux-shell系列7-ssh密匙生成分发

     sshpass  该软件就是为ssh提供密码使用的yum install sshpass -y 批量分发脚本内容 #!/bin/bash. /etc/rc.d/init.d/functions # ...

  6. BZOJ3653谈笑风生——可持久化线段树+dfs序

    题目描述 设T 为一棵有根树,我们做如下的定义: ? 设a和b为T 中的两个不同节点.如果a是b的祖先,那么称“a比b不知道 高明到哪里去了”. ? 设a 和 b 为 T 中的两个不同节点.如果 a ...

  7. LightOJ - 1074 Extended Traffic(标记负环)

    题意:有n个城市,每一个城市有一个拥挤度ai,从一个城市u到另一个城市v的时间为:(au-av)^3,存在负环.问从第一个城市到达第k个城市所话的时间,如果不能到达,或者时间小于3输出?否则输出所花的 ...

  8. LOJ #2434. 「ZJOI2018」历史(LCT)

    题意 click here 题解 我们首先考虑答案是个什么样的东西, 不难 发现每个点可以单独计算它的贡献. 令每个点 \(i\) 崛起次数为 \(a_i\) . 假设一个点子树的 \(\sum a_ ...

  9. 25 行 Python 代码实现人脸识别——OpenCV 技术教程

    OpenCV OpenCV 是最流行的计算机视觉库,原本用 C 和 C++ 开发,现在也支持 Python. 它使用机器学习算法在图像中搜索人的面部.对于人脸这么复杂的东西,并没有一个简单的检测能对是 ...

  10. 洛谷 P2764 最小路径覆盖问题 解题报告

    P2764 最小路径覆盖问题 问题描述: 给定有向图\(G=(V,E)\).设\(P\) 是\(G\) 的一个简单路(顶点不相交)的集合.如果\(V\) 中每个顶点恰好在\(P\) 的一条路上,则称\ ...