当前位置: 首页 > news >正文

C# 观察者模式实现

代码:


using System;
using System.Collections.Generic;public delegate void NotificationObserverCallback(object obj);public class NotificationObserver
{public NotificationObserverCallback Selector = null;public string KeyName = "";
}public class NotificationCenter{private static NotificationCenter _instance;private Dictionary<object, List<NotificationObserver>> _allObserversDic;public static NotificationCenter Instance{get { if (_instance == null) { _instance = new NotificationCenter(); } return _instance; }}private NotificationCenter(){_allObserversDic = new Dictionary<object, List<NotificationObserver>>();}private bool ObserverExisted(object target,  string name){if (target != null) {if (_allObserversDic.ContainsKey(target)){var lists = _allObserversDic[target];foreach(var item in lists){if (item.KeyName == name){return true;}}}}return false;}public void AddObserver(object target, NotificationObserverCallback selector, string name){if (target != null && name.Length > 0) {if (this.ObserverExisted(target, name) == false){var observer = new NotificationObserver();observer.Selector = selector;observer.KeyName = name;if (_allObserversDic.ContainsKey(target) == false){var lists = new List<NotificationObserver>();lists.Add(observer);_allObserversDic.Add(target, lists);}else{_allObserversDic[target].Add(observer);}}}}public void RemoveObserver(object target, string name){if (_allObserversDic.ContainsKey(target)){var lists = _allObserversDic[target];foreach (var item in lists){if (item.KeyName == name){lists.Remove(item);break;}}if (lists.Count == 0){_allObserversDic.Remove(target);}}}public void RemoveAllObservers(object target){_allObserversDic.Remove(target);}private void TryPostNotification(string name,object obj){foreach (var pair in _allObserversDic){foreach (var item in pair.Value){if (item.KeyName == name) {if (item.Selector != null) {item.Selector(obj);}}}}}public void PostNotification(string name){this.TryPostNotification(name, null);}
}

 添加监听

public void Init()
{NotificationCenter.Instance.AddObserver(this, TestRespond, "test__");
}private void TestRespond(object obj) {}

 抛出事件

NotificationCenter.Instance.PostNotification("test__");

相关文章:

  • 【Linux】深入理解 Linux 的 chmod 指令
  • 音视频-常用的分析工具介绍-连续补充
  • 基于Django的美团药品数据分析与可视化系统,有多用户功能,可增删改查数据
  • 产品经理交接规范及流程
  • vue3的api风格
  • 【学习笔记】后端(Ⅰ)—— NodeJS(Ⅰ)
  • 鸿蒙HarmonyOS开发:tabs结合tabContent实现底部tabBar导航栏页面布局
  • 再谈Google I/O 2024:开发者必看亮点
  • Redis-
  • pytorch-20 lstm实践
  • python输出水仙花数两种方法
  • 垃圾溢满堆放识别检测
  • Hugging Face的TrainingArguments常用参数学习
  • 【高阶数据结构】跳表
  • Leecode---112:路径总和(是否存在和为target路径)
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • 10个确保微服务与容器安全的最佳实践
  • 2017 年终总结 —— 在路上
  • 2017-09-12 前端日报
  • JavaScript标准库系列——Math对象和Date对象(二)
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • MySQL QA
  • Next.js之基础概念(二)
  • ReactNative开发常用的三方模块
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • Spring声明式事务管理之一:五大属性分析
  • 二维平面内的碰撞检测【一】
  • 每天10道Java面试题,跟我走,offer有!
  • 一天一个设计模式之JS实现——适配器模式
  • 怎样选择前端框架
  • const的用法,特别是用在函数前面与后面的区别
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • ​学习笔记——动态路由——IS-IS中间系统到中间系统(报文/TLV)​
  • ######## golang各章节终篇索引 ########
  • #Z2294. 打印树的直径
  • #大学#套接字
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第2节(泛型类的类构造函数)
  • (附源码)php新闻发布平台 毕业设计 141646
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (十六)一篇文章学会Java的常用API
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)Unity3DUnity3D在android下调试
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .net 流——流的类型体系简单介绍
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .NET 中让 Task 支持带超时的异步等待
  • .NET的数据绑定
  • /使用匿名内部类来复写Handler当中的handlerMessage()方法
  • ??如何把JavaScript脚本中的参数传到java代码段中