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的地方希望大家可以留言指正,我会尽快修改。
ObservableData-另一种姿势的观察者模式的更多相关文章
- 快速了解IOC的几种姿势
一.首先我们了解IOC如何注入的几种姿势 构造函数注入(Constructor Injection) Ioc容器会智能的选择和调用合适的构造函数以创建依赖的对象.如果被选择的构造函数具有相应的参数,I ...
- 两个文件去重的N种姿势
最近利用shell帮公司优化挖掘关键词的流程,用shell替代了多个环节的操作,极大提高了工作效率. shell在文本处理上确有极大优势,比如多文本合并.去重等,但是最近遇到了一个难搞的问题,即两个大 ...
- 又拍云张聪:OpenResty 动态流控的几种姿势
2019 年 1 月 12 日,由又拍云.OpenResty 中国社区主办的 OpenResty × Open Talk 全国巡回沙龙·深圳站圆满结束,又拍云首席架构师张聪在活动上做了< Ope ...
- 补习系列(7)-springboot 实现拦截的五种姿势
目录 简介 姿势一.使用 Filter 接口 1. 注册 FilterRegistrationBean 2. @WebFilter 注解 姿势二.HanlderInterceptor 姿势三.@Exc ...
- python打开文件的N种姿势
# python打开文件的N种姿势 print('[1]使用open()函数+简单for循环') f1 = open('python.txt') for line in f1: print(line. ...
- [转]地图投影的N种姿势
此处直接给出原文链接: 1.地图投影的N种姿势 2.GIS理论(墨卡托投影.地理坐标系.地面分辨率.地图比例尺.Bing Maps Tile System)
- 【bzoj3224】Tyvj 1728 普通平衡树 01Trie姿势+平衡树的四种姿势 :splay,旋转Treap,非旋转Treap,替罪羊树
直接上代码 正所谓 人傻自带大常数 平衡树的几种姿势: AVL Red&Black_Tree 码量爆炸,不常用:SBT 出于各种原因,不常用. 常用: Treap 旋转 基于旋转操作和随机数 ...
- SpringBoot系列教程web篇Servlet 注册的四种姿势
原文: 191122-SpringBoot系列教程web篇Servlet 注册的四种姿势 前面介绍了 java web 三要素中 filter 的使用指南与常见的易错事项,接下来我们来看一下 Serv ...
- python HelloWorld 的 4 种姿势,你知道几种
安装完 Python 之后该干啥,当然是要 say HelloWorld 了. python.exe 就是个普通程序 和其它所有命令一样,在命令行中敲下 python 并回车的时候,操作系统去 PAT ...
随机推荐
- 用async/ await来发送异步
昨天看了一篇vue的教程,作者用async/ await来发送异步请求,从服务端获取数据,代码很简洁,同时async/await 已经被标准化,是时候学习一下了. 先说一下async的用法,它作为一个 ...
- [日常工作] Linux与Windows的连接访问以及数据共享等方法 vncserver smb xshell xftp winscp mount等
日常办公机器是用 windows, 但是越来越多的测试和工作需求需要使用linux. 这里以最常用的系统centos为例进行说明 1. 远程连接 ssh的方式 建议使用xmange 系列的 xshel ...
- React props传变量
<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8" ...
- selenium之测试卫星资料页面操作(元素遍历)
# 测试气象卫星资料页面功能 # author:gongxr # date:2017-07-24 import random, time from selenium import webdriver ...
- day9 笔记
集合 去重 无序 元素不可变类型 可hash 命令 set() 创建可变集合 frozenset() 创建不可变集合 .add() 添加元素,只能放单个值 .update() 添加元素,可以更新多个值 ...
- MT【59】一道迭代函数作图
[Read a good book, that is conversation with many a noble man.]---勒内·笛卡尔(1596-1650) 解答: 评:也可以把f(f(x) ...
- LOJ #6270. 数据结构板子题 (离线+树状数组)
题意 有 \(n\) 个区间,第 \(i\) 个区间是 \([l_i,r_i]\) ,它的长度是 \(r_i-l_i\) . 有 \(q\) 个询问,每个询问给定 \(L,R,K\) ,询问被 \([ ...
- 自学Linux Shell2.2-GHOME Terminal仿真器
点击返回 自学Linux命令行与Shell脚本之路 2.2-GHOME Terminal仿真器 GNOME Terminal是GNOME桌面环境的默认终端仿真器.很多发行版,如RHEL.Fedora和 ...
- [CF791D]Bear and Tree Jumps
题目描述 A tree is an undirected connected graph without cycles. The distance between two vertices is th ...
- FreeRTOS不允许在中断服务程序和临界段中执行不确定的性的操作
举例 等待事件标志组的任务,要是在中断服务程序中设置事件标志组,但不知道当前有多少个任务在等待此事件标志,这个操作即为不确定性操作,为了不在中断服务程序中执行此不确定性操作,只在中断服务程序中给一确定 ...