C# 观察者模式实现

代码:

cs 复制代码
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);
    }
}

添加监听

cs 复制代码
public void Init()
{
    NotificationCenter.Instance.AddObserver(this, TestRespond, "test__");
}

private void TestRespond(object obj) {
     
}

抛出事件

cs 复制代码
NotificationCenter.Instance.PostNotification("test__");
相关推荐
longxiaozhang613 小时前
C# Array类:数组其实没那么难
开发语言·c#
longxiaozhang616 小时前
C#运算符重载:让对象也能使用“加减乘除”
开发语言·c#
花落人散处17 小时前
C# 核心编程知识点总结:网络编程、委托与事件、异步编程与LINQ
c#
fl17683120 小时前
基于C#WPF实现的内存加速球清理类似360加速球内存清理
开发语言·c#·wpf
CoderIsArt1 天前
OPC UA 完整介绍、官网、C# 简单使用
开发语言·c#
界面开发小八哥1 天前
界面控件DevExpress XAF v26.1新版亮点——AI Agent Skills
ai·c#·跨平台·devexpress·ui开发·xaf
csdn_aspnet1 天前
C# 高效便利的处理数据
开发语言·windows·c#
淡海水1 天前
03-02-线性-List-T-动态数组布局-扩容与操作成本
数据结构·windows·c#·list·编译·clr·机器码
csdn_aspnet1 天前
C# 在逗号分割的字符串中判断是否包含指定字符
c#·正则·linq·string·regex·contains
宝桥南山1 天前
Blazor Web Assembly - 体验一下Authentication State从Server共享给Client
microsoft·微软·c#·asp.net·.net·.netcore