Delegate 详讲(三)

UE4的delegate  首先,UE4中的delegate和C#里边是一样的,delegate的本质是一个特殊类的对象,它可以储存(一个或多个)函数指针和payload数据(就是除了函数指针,还能存些你调用时候的额外参数)UE4中的delegate类名字中都有signature,这里我们以overlap的回调委托为例:在各种mesh components中,都有这么一个字段 FComponentBeginOver 阅读详情
 

几天前给学生上课,一个学生问我用Delegate与Event实现Observer模式与不用它们实现到底有什么区别?我便讲了一个用奶箱订报纸的故事。

现在很多人都同时在订报纸和牛奶,送报纸的和送牛奶的也会在楼门口钉上一个箱子,一来方便,二来也为自己做做广告。现在楼门口前钉的大大小小都是箱子,几乎挤满了所有可用的地方。报箱是那种长长的,而奶箱子则有些四四方方,上面都开了可口,用来投递的。我家原来订了奶,楼门口众多的奶箱中有一个就是我家的,可后来不打算订了,就留了个空奶箱在那里。最近又有订报纸的打算,可打量了一番门口大大小小的箱子,实在是拥挤不堪,难以放下另外一个报箱了。于是我想让他们把报纸投到奶箱里算了,还省了不少麻烦。可偏偏碰上一家送报的对我说,我只会把报纸投到报箱中,投到奶箱中的事我不会!也难怪,他们公司没有使用Delegate!唉。

using System;
using System.Collections;

public interface IMilkBox
{
  
void PutMilkIn(string s);
}


public interface INewsPaperBox
{
  
void PutNewsPaperIn(string s);
}


public class Subscriber : INewsPaperBox, IMilkBox  
{
  
public string name;

  
public Subscriber(string name)
  
{
    
this.name = name;
  }


  
public void PutNewsPaperIn(string s)
  
{
    Console.WriteLine(
"{0}在报箱里收到送来的{1}",name, s);
  }


  
public void PutMilkIn(string s)
  
{
    Console.WriteLine(
"{0}在奶箱里收到送来的{1}",name, s); 
  }

}


public class NewsPaperSender
{
  
protected ArrayList subscribers = new ArrayList();

  
public void SendNewsPaper()
  
{
    
foreach(INewsPaperBox newsPaperBox in subscribers)
      newsPaperBox.PutNewsPaperIn(
"报纸");
  }


  
public void Subscribe(INewsPaperBox newsPaperBox)
  
{ subscribers.Add(newsPaperBox); }
}


public class MilkSender
{
  
protected ArrayList subscribers = new ArrayList();

  
public void SendMilk()
  
{
    
foreach(IMilkBox milkBox in subscribers)
      milkBox.PutMilkIn(
"牛奶");
  }


  
public void Subscribe(IMilkBox milkBox)
  
{ subscribers.Add(milkBox); }
}


public class Client
{
  
public static void Main( string[] args )
  
{
    MilkSender ms 
= new MilkSender();
    NewsPaperSender nps 
= new NewsPaperSender();
    
    Subscriber s1 
= new Subscriber("张三");
    Subscriber s2 
= new Subscriber("李四");
    Subscriber s3 
= new Subscriber("王五");

    ms.Subscribe(s1);
    ms.Subscribe(s2);

    nps.Subscribe(s2);
    nps.Subscribe(s3);

    ms.SendMilk();
    Console.WriteLine(
"--------------------");
    nps.SendNewsPaper();
  }

}


后来我碰上了一家送报纸的比较灵活,只要是有口的箱子都可以送,不管是报箱还是奶箱,我的想法终于得到实现了,当然这也要归功于Delegate。

using System;

public delegate void SendableDelegate(string s);

public class Subscriber
{
  
public string name;

  
public Subscriber(string name)
  
{
    
this.name = name;
  }


  
public void PutNewsPaperIn(string s)
  
{
    Console.WriteLine(
"{0}在报箱里收到送来的{1}",name, s);
  }


  
public void PutMilkIn(string s)
  
{
    Console.WriteLine(
"{0}在奶箱里收到送来的{1}",name, s); 
  }

}


public class NewsPaperSender
{
  
public event SendableDelegate SendNewsPaperHandler;

  
public void SendNewsPaper()
  
{
    
if(SendNewsPaperHandler != null)
      SendNewsPaperHandler(
"报纸");
  }


  
public void Subscribe(SendableDelegate sd)
  
{
    SendNewsPaperHandler 
+= sd;
  }

}


public class MilkSender
{
  
public event SendableDelegate SendMilkHandler;

  
public void SendMilk()
  
{
    
if(SendMilkHandler != null)
      SendMilkHandler(
"牛奶");
  }


  
public void Subscribe(SendableDelegate sd)
  
{
    SendMilkHandler 
+= sd;
  }

}


public class Client
{
  
public static void Main( string[] args )
  
{
    MilkSender ms 
= new MilkSender();
    NewsPaperSender nps 
= new NewsPaperSender();
    
    Subscriber s1 
= new Subscriber("张三");
    Subscriber s2 
= new Subscriber("李四");
    Subscriber s3 
= new Subscriber("哈哈!吕震宇");

    ms.Subscribe(
new SendableDelegate(s1.PutMilkIn));
    ms.Subscribe(
new SendableDelegate(s2.PutMilkIn));

    nps.Subscribe(
new SendableDelegate(s2.PutNewsPaperIn));
    nps.Subscribe(
new SendableDelegate(s3.PutMilkIn));

    ms.SendMilk();
    Console.WriteLine(
"--------------------");
    nps.SendNewsPaper();
  }

}

呵呵,不知道这回有没有搞清楚Delegate的作用?

UE4里的Delegate Delegate的本质是回调,是观察者模式的应用。 A里产生变化需要与A1,A2,A3有交互。有3种方式: 方式1:A里调用A1, A2,A3的方法。 方式2:A1, A2, A3里调用A的方法。 方式3:弄一个中间者,Event/Delegate,A不用知晓A1, A2,A3的存在,A1,A2,A3也不用知道A的存在(Event/Delegate可以不用放在A里,另外放在另一个类里也没问... 阅读详情

相关推荐

UE4之Delegate:动态单播

定义 #define FUNC_CONCAT( ... ) __VA_ARGS__ #define DECLARE_DYNAMIC_DELEGATE( DelegateName ) BODY_MACRO_COMBINE(CURRENT_FILE_ID,_,__LINE__,_DELEGATE) FUNC_DECLARE_DYNAMIC_DELEGATE( FWeakObjectPtr, Dele...

Mccree的博客专栏 1258

milk and news paper(transfer)

用奶箱订报纸 几天前给学生上课,一个学生问我用Delegate与Event实现Observer模式与不用它们实现到底有什么区别?我便讲了一个用奶箱订报纸的故事。 现在很多人都同时在订报纸和牛奶,送报纸的和送牛奶的也会在楼门口钉上一个箱子,一来方便,二来也为自己做做广告。现在楼门口前钉的大大小小都是箱子,几乎挤满了所有可用的地方。报箱是那种长长的,而奶箱子则有些四四方方,上面都开了可口,用来...

weixin_30663391的博客 134

虚幻4 C++绑定Delegate

C++ Delegate

虚幻4引擎工作室 1579

订报纸引发的设计模式---观察者模式

生活中我们有这个经历,订报纸的情况, 我付钱订阅了报纸, 只要他们那边有新的报纸, 就会给我发到家里面, 软件里面的设置的一大类的问题也可以总结为这个方案来解决, 你不订阅我们就不给你发消息, 你订阅了, 我们才会给你发消息,这也就是观察者模式。 一个气象站, 来获得数据, 然后一个软件是来不断的更新数据, 要显示不同的显示牌子,这些牌子的显示就是不同的对象实例。也就是一个主题和,和一

foodvc的专栏 642

delegate的用法

背景delegate字面意思是委托,代表,会议代表,授权,选派。很多客户端工程师应该不陌生,特别是处理界面UI时,在UI库的源码里经常遇到,你可能会蹦出MVC模式,或者其他设计模式里有这个用法。正确运用它们可以轻而易举的将复杂页面打造得简洁明了、层次分明。委托概述 将方法调用者和目标方法动态关联起来,委托是一个类,所以它和类是同级的,可以通过委托来掉用方法,不要误以为委托和方法同级的,方法只是类的成员。委托定义了方法的类型(定义委托和与之对应的方法必须具有相同的参数个数,并且类型相同,返回值类型相同),使得

dream it possible 1532

标签传播算法LPA:半监督学习解决标注数据不足的完整实战指南

在机器学习实际工程中,标注数据稀缺往往是制约模型性能的核心瓶颈。半监督学习提供了一条利用海量未标注数据来增强模型泛化能力的有效路径,其中标签传播算法(Label Propagation Algorithm, LPA)因其直观的图结构和优雅的数学原理而备受关注。LPA通过将样本映射为图中的节点,以相似度作为边权重,让已知标签沿着图结构不断扩散,从而实现对未知样本的预测。其背后基于聚类假设与流形假设,能在低标注率场景下显著缓解过拟合问题,提升分类准确率。该技术在文本分类、金融风控、图像识别等存在大量无标注数据的

weixin_29056781的博客 239

一个C++ delegate的实现

更新说明:修改了借口,增加了对smart_ptr的支持。最近需要一个C++delegate的实现,比较接近C#的delegate的用法。翻遍了boost,虽然有相近的东西,但是,始终使用起来问题多多:function:的绑定方式倒也可以接受,成员函数调用的方式实在不爽。而且,同样的函数原型,native和member对应的function类型不同,不同class的相同原型的member funct

不亦快斋 1万+

瑞芯微RK3588与FPGA的PCIe DMA通信性能优化实战

本文深入探讨了瑞芯微RK3588与FPGA之间PCIe DMA通信的性能优化实战。针对高速数据采集、AI推理等场景下的带宽瓶颈,文章从驱动配置、DMA描述符、中断处理、零拷贝技术及系统级调优等多个层面,提供了详细的优化策略与代码示例,旨在充分释放PCIe 3.0的理论带宽潜力,提升数据传输效率与稳定性。

sand8的博客 418

[UE C++] Delegate使用详解

Delegate的使用方法总结终于告一段落,文章比较长,若有错误,欢迎指出。学疏才浅,还请见谅。

qq_52179126的博客 6819

UE5 Paper2D性能优化:GroupedSpriteSceneProxy合批渲染原理与实践

在游戏开发中,渲染性能优化是核心技术挑战之一,其核心原理在于减少CPU与GPU之间的通信开销,特别是降低Draw Call数量。Draw Call是CPU向GPU提交绘制命令的指令,每次调用都涉及状态切换和数据传输,当场景中存在大量同质化对象时,频繁的Draw Call会成为主要性能瓶颈。为此,现代图形引擎普遍采用合批渲染技术,其技术价值在于将多个共享相同渲染状态(如材质、几何体)的物体数据合并提交,从而将多次Draw Call压缩为一次或少数几次,显著提升渲染效率。这一技术在2D游戏开发中尤为重要,例如在

weixin_34198453的博客 394

unity之——解决利用Jenkins在Windows环境下打包unity工程中的场景为apk包,打包打不出来的问题。并且介绍Jenkins从安装到环境配置,调用unity代码的过程(填坑)!!!!!

今天第一次接触Jenkins,比较头疼。网上的Jenkins配置环境相关的资料比较散乱,并且在Windows平台下相关的配置更是少之又少。我在这里讲一下从Jenkins安装到构建工程。打包unity工程的apk包的过程。 1.首先去Jenkins官网下载安装就不说了,安装完成之后在浏览器中输入http://localhost:8080(默认访问地址)进入Jenkins web界面。进行账号的注册...

cgy56191948的博客 2020

C++实现Delegate

大家都知道C#的Delegate非常的好用,特别是应用在Subject-Observer模式的时候,具有很好的灵活性,但是C++只有function pointers,前面有一篇blog讲到了它的问题,以及难以理解的地方。不过也提到boost使用模板实现了boost::function基本具备了delegate的特点,我稍加改造,去除了boost的依赖关系,实现了一个小巧的Delegate,不过鉴

1914

从半导体物理到实战:手把手教你测量MOS管体二极管的Vf和Trr

本文深入探讨了MOSFET体二极管的关键参数测量方法,重点讲解了正向压降(Vf)和反向恢复时间(Trr)的测量原理与实战步骤。通过搭建测试平台,使用万用表和示波器等工具,手把手指导如何量化这些影响开关损耗和效率的核心参数,并对比分析了硅基与碳化硅(SiC)器件在体二极管性能上的显著差异。

n7o8p的博客 341

Android源码之DeskClock (三) Proxy/Delegate Application 框架应用

1.概述 当项目有加壳子的需求的时候,可以使用Proxy/Delegate Application框架的方式,在正常的模式中,一个程序一般只有一个Application入口,而Proxy/Delegate模式中需要有两个Application,原程序的Application改为Delegate Application,再新加一个Proxy Application

Jesse的专栏 1万+

震惊!用刚发布的GPT-5写研究现状,文献综述写作一整个大逆袭(附步骤+10条AI提示词)

每类分别给出:国内重点(3 条)、国外重点(3 条)、代表性方法(2–3 条)、代表成果(各 1–2 条)、主要问题(2 条)。每个场景给出:技术方案(2–3 种)、研究目标、实际成效/案例、当前挑战(3 点)。指令:基于国内外现状,系统列出当前学界的研究空白、关键未解问题与争议焦点(每项配简要证据/示例),并针对每个空白提出 1–2 条可行的研究方向或方法路径。三、差异与研究空白分析(≥300 字)。对每个小节提供:小标题、中心论点(1 句)、拟写要点(3–5 条)、建议引用类型(理论/方法/案例)。

qq_64378896的博客 114

Halcon 色彩标定:RGB空间下实现白平衡与CCM矩阵合成静态HDR图像

摘要 本文介绍了一种基于Halcon的色彩校正方法,结合白平衡与灰轴约束最小二乘法实现精准颜色还原。方法分为三步:1)自动定位色卡区域并提取灰阶块计算白平衡增益;2)通过前三列色块建立测量值与标准值的映射关系;3)引入灰轴约束条件求解色彩校正矩阵(CCM),确保中性灰区域不偏色。算法采用中位数计算白平衡增益以提高鲁棒性,并通过旋转校正处理色卡倾斜问题。实验表明,该方法能有效消除相机采集的系统色偏,适用于颜色测量、表面检测等机器视觉场景。文末提供了完整代码实现。

LIN943168247的博客 406

QTreeWidget设置Delegate

1、QT分为:Mode层,View层,数据存放在Mode里面,显示在View层,当我们修改了View层的同时,需要修改Mode层。 2、Delegate工作原理:当我们点击支持编辑的列,创建自定义的编辑控件(可为button、spinbox、combobox等等),然后从Mode层,取值,设置给控件,当自定义控件,编辑完成,再设置给Mode层 3、自定义Delegate class Ite...

qq_15821883的博客 3974

SAP-ABAP:新手入门篇——从0到1写出你的第一个ABAP Hello World程序并完成调试运行

本文是ABAP开发入门指南,详细介绍如何创建并运行第一个"Hello World"程序。主要内容包括:通过SE38事务码进入ABAP编辑器;创建以Z/Y开头的程序并保存为本地对象;编写简单的WRITE输出语句;完成语法检查、激活和执行流程;以及初步体验调试功能。文章特别强调ABAP开发的规范要求,如程序命名规则、激活与保存的区别等,并提供了详细的步骤说明和常见问题提示,帮助零基础开发者快速上手ABAP编程。

baidu_35680696的博客 479

delegate关键字与Delegate类型

今天写了一个例子,能说明delegate和Delegate的不同,帖在下面,注释很全: 1usingSystem; 2usingSystem.Collections.Generic; 3usingSystem.Text; 4usingSystem.Resources; 5usingSystem.Reflection; 6usingSys...

Zy0414的博客 509

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

C# Delegate 引介

CUJ July,2001 - The C# Delegate - C# Delegate 引介 - by Stanley B. LippmanC# Delegate 引介Stanley B. LippmanTODO-01-->[译序:这是一篇古老的文章。但毫无疑问,Lippman对delegate的阐述是精辟的。]如果你想拿 C# 与其它“C家族”的语言

方舟 K ][ N G of A R K 2663

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【Groovy】闭包 Closure ( 闭包的 delegate 代理策略 | OWNER_FIRST | DELEGATE_FIRST | OWNER_ONLY | DELEGATE_ONLY )

一、闭包的代理策略引入、 二、闭包的四种代理策略

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 1918

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

C++实现事件委托delegate

用C++做项目的时候,尤其是写客户端的时候经常会有事件回调的设计,一般的方式是使用虚函数表,用一个虚基类包含一系列的回调函数。但这种方式和C++11的lamda不兼容,为了更方便的实现事件回调机制,使用delegate是很不错的一种方式。参考了duilib的CDelegate和C#的Deleagte<T>得出如下实现: #pragma once #include<functional> #include <map> #include<vector> #in

codeofcc的博客 2150

c#中delegate使用

引言 Delegate是Dotnet1.0的时候已经存在的特性了,但由于在实际工作中一直没有机会使用Delegate这个特性,所以一直没有对它作整理。这两天,我再度翻阅了一些关于Delegate的资料,并开始正式整理这个C#中著名的特性。本文将由浅入深的谈一下Delegate这个特性。 一.Delegate是什么? Delegate中文翻译为“委托”。Msdn中对Delegate的解释如下: C#中的委托类似于C或C++中的函数指针。使用委托使程序员可以将方法引用封装在委托对象内。然后可以将该委托对象传

进阶的小白 2301

Unity3d 最基本delegate实例

基本的delegate代码如下: public class Delegate : MonoBehaviour { public delegate void NumDelegate(int args); public NumDelegate numDelegate; // Start is called before the first frame update ...

xpala的博客 2480

UE 中的 Delegate(代理)

已经说了不少内容了!代理在概念上很简单,”调用一个方法并且所有的订阅者会被通知“,但是在 Unreal 中有些复杂。当你熟悉了使用动态多播代理后,可以移步到高级代理教程!更多的代理类型:单一代理,非动态代理增加返回值事件。

a_jie_csdn的博客 852

iOS delegate挂钩

Objective-C 奇巧淫技–delegate挂钩奇技淫巧 指过于奇巧而无益的技艺与制品.需求说明在实际的编程过程中,我们总要定制一些控件,在定制的过程里,有时喜欢自己实现部分delegate方法// MYScrollView.m- (instancetype)init { ... self.delegae = self; ... }- (void)scrollViewD

晓月的专栏 4272
上一篇: Delegate比较全面的例子
下一篇: 让人感慨的21个故事
雪岢奇
博客等级 码龄17年 310粉丝 60原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值