C# 委托与事件 观察者模式

委托与事件是一种观察者模式

什么是委托与事件

在c#中,委托类似于代理,也跟其它语言的函数指针、回调函数等相似,但委托是类型安全和可靠的。声明自定义委托时,加上delegate关键字,委托定义类似于接口。

事件是特殊类型的多播委托,仅可从发布者中调用,如果其它类或结构订阅了该事件,则当发布者引发该事件时,会调用其事件处理程序方法。

特殊的委托类型

Action 是无返回值的委托

Action 表示无参,无返回值的泛型委托

Action<int,string,bool>表示传入参数int,string,bool,无返回值的委托

Action<int,int,int,int>表示传入4个int型参数,无返回值的委托

Func 是有返回值的泛型委托

Func< int > 表示无参,返回值为int的委托

Func<object,string,int> 表示传入参数为object, string,返回值为int的委托

Func<T1,T2,T3,int> 表示传入参数为泛型T1,T2,T3,返回值为int的委托

发布订阅事件

发布者:负责定义和触发事件。发布者创建事件并在适当的时候触发它,通知所有订阅者事件的发生。它通常不关心事件的具体处理细节,只关注事件的发生。

发布者(主题):

在用户点击按钮时,它会触发一个"按钮点击"事件。它管理一个事件列表,知道哪些订阅者注册了对"按钮点击"事件的兴趣。

cs 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class controller : MonoBehaviour
{
    public delegate void ClickAAction();//定义无参无返回值的委托
    public static event ClickAAction OnClick;//定义OnClick事件
    private void OnGUI()
    {
        if(GUI.Button(new Rect(Screen.width/2-50,5,100,30),"click"))
            {
            // if (OnClick != null)
            // {
            //     OnClick();
            // }
            OnClick?.Invoke();//调用事件,包括已订阅的事件
        }
    }
}

订阅者:负责响应事件。订阅者注册对事件的处理方法,并在事件被触发时执行这些处理方法。订阅者关心事件发生后的具体操作和逻辑。

订阅者(观察者):

它注册自己对"按钮点击"事件的兴趣,并提供一个函数来处理点击事件。当按钮被点击并触发事件时,函数被调用,记录下按钮点击的事件。

cs 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class manager : MonoBehaviour
{
    private void OnEnable()
    {
        controller.OnClick += Tele;//订阅事件
    }
    private void OnDisable()
    {
        controller.OnClick -= Tele;//取消订阅
    }
    void Tele()
    {
      Vector3 pos=transform.position;
        pos.y = Random.Range(.3f,1.0f);
        transform.position = pos;
    }
}

小结

发布者负责定义事件与调用事件,而订阅者负责注册事件与具体的操作处理。

相关推荐
是娇娇公主~5 小时前
C++ 中 std::deque 的原理?它内部是如何实现的?
开发语言·c++·stl
SuperEugene5 小时前
Axios 接口请求规范实战:请求参数 / 响应处理 / 异常兜底,避坑中后台 API 调用混乱|API 与异步请求规范篇
开发语言·前端·javascript·vue.js·前端框架·axios
xuxie996 小时前
N11 ARM-irq
java·开发语言
唐青枫7 小时前
C#.NET ReaderWriterLockSlim 深入解析:读写锁原理、升级锁与使用边界
c#·.net
wefly20177 小时前
从使用到原理,深度解析m3u8live.cn—— 基于 HLS.js 的 M3U8 在线播放器实现
java·开发语言·前端·javascript·ecmascript·php·m3u8
luanma1509807 小时前
PHP vs C++:编程语言终极对决
开发语言·c++·php
寂静or沉默7 小时前
2026最新Java岗位从P5-P7的成长面试进阶资源分享!
java·开发语言·面试
张老师带你学8 小时前
UnityVR弯曲UI
科技·游戏·unity·游戏引擎·模型
kyriewen118 小时前
给浏览器画个圈:CSS contain 如何让页面从“卡成PPT”变“丝滑如德芙”
开发语言·前端·javascript·css·chrome·typescript·ecmascript
娇娇yyyyyy9 小时前
QT编程(18): Qt QItemSelectionModel介绍
开发语言·qt