C#的单例模式 以及 消息分发机制实现

Wesley13
• 阅读 1120

C#单例模式,多线程安全

//Singleton.cs
public class Singleton<T> where T : new()
{
    private static T _instance;
    private static object _lock = new object();

    protected Singleton() {}
    public static T Instance()
    {
        if(_instance == null)
        {
            lock(_lock)
            {
                if(_instance == null)
                {
                    _instance = new T();
                }
            }
        }
        return _instance;
    }
}

C#消息分发机制,用了delegate

//MessageDispatcher.cs
using System.Collections;
using System.Collections.Generic;
public class MyMessageDispatcher : Singleton<MyMessageDispatcher>
{
    Dictionary<uint, MessageHandler> m_HandlerMap;
    
    public MyMessageDispatcher()
    {
        m_HandlerMap = new Dictionary<uint, MessageHandler> ();
    }
    
    public void RegisterMessageHandler(uint iMessageType, MessageHandler handler)
    {
        if (handler == null)
            return;
        
        
        if (!m_HandlerMap.ContainsKey (iMessageType)) 
        {
            MessageHandler Handlers = handler;
            m_HandlerMap.Add (iMessageType, Handlers);
        } 
        else 
        {
            m_HandlerMap[iMessageType] += handler;
        }
    }
    
    public void UnRegisterMessageHandler(uint iMessageType,  MessageHandler handler)
    {
        if (handler == null)
            return;
        
        if(m_HandlerMap.ContainsKey (iMessageType))
        {
            m_HandlerMap[iMessageType] -= handler;
        }
    }
    
    public void SendMessage(uint iMessageType, object arg)
    {
        if(m_HandlerMap.ContainsKey (iMessageType))
        {
            if(m_HandlerMap[iMessageType] != null)
            {
                m_HandlerMap[iMessageType].Invoke(iMessageType, arg);
            }
        }
    }
}

//EMessageType.cs中定义事件类型
public enum EUIMessage : uint
{
    UITest0 = 0,
    UITest1 = 1,
    UITest2 = 2
}

使用消息分发机制示例:

//发出消息事件
MessageDispatcher.Instance().SendMessage((uint)EUIMessage.UITest0, “ouput”);

//接受消息端,先要注册侦听消息,此处的例子是在Unity3D中实现的
public class TestText : MonoBehaviour 
{
    void OnEnable()
    {
        MyMessageDispatcher.Instance ().RegisterMessageHandler ((uint)EUIMessage.UITest0, ChangePlay0);
    }

    void OnDisable()
    {
        MyMessageDispatcher.Instance ().UnRegisterMessageHandler ((uint)EUIMessage.UITest0, ChangePlay0);
    }

    public void ChangePlay0(uint iMessageType, object kParam)
    {
        string txt = (string) kParam;
        GUIText text = GetComponent<GUIText>();
        text.text = txt ;
    }
}
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Mybatis Plus代码方式实现多表关联查询
 Mapper接口如下:例1@Select("SELECTt\_question.\,t\_student.\name\FROMt\_question,t\_studentWHEREt\_question.student\_idt\_student.id")List<QuestionStudentVOgetQ
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
3年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
C#设计模式(1)——单例模式(Singleton)
单例模式即所谓的一个类只能有一个实例,也就是类只能在内部实例一次,然后提供这一实例,外部无法对此类实例化。单例模式的特点:1、只能有一个实例;2、只能自己创建自己的唯一实例;3、必须给所有其他的对象提供这一实例。普通单例模式(没有考虑线程安全)  ///<summary///单例模式
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这