1、定义
delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类。与其它的类不同,delegate类能够拥有一个签名(signature),并且它"只能持有与它的签名相匹配的方法的引用"。
它允许你传递一个类A的方法m给另一个类B的对象,使得类B的对象能够调用这个方法m。
delegate是面向对象、类型安全、可靠的受控(managed)对象。也就是说,运行时能够保证delegate指向一个有效的方法,你无须担心delegate会指向无效地址或者越界地址。
2、委托的声明原型
delegate <函数返回类型> <委托名> (<函数参数>)
public delegate void CheckDelegate(int number);
委托在.net内相当于声明了一个类,类如果不实例化为对象,很多功能是没有办法使用的,委托也是如此。
3、委托的实例化
委托实例化的原型
<委托类型> <实例化名>=new <委托类型>(<注册函数>)
CheckDelegate checkDelegate=new CheckDelegate(CheckMod);
4、创建步骤
(1)声明一个delegate对象,它应当与你想要传递的方法具有相同的参数和返回值类型。
(2)创建delegate对象,并"将你想要传递的函数作为参数
传入"。
(3)通过上一步创建的对象来调用方法
创建一个Subject对象
using System;
public class ConcreteSubject
{
/// <summary>
/// 声明委托
/// </summary>
public delegate void CustomerEventHandler(String state);
// 声明一个委托事件,类型为 CustomerEventHandler
public event CustomerEventHandler Update;
static ConcreteSubject instance;
private string subjectState;
/// <summary>
/// 观察者理应是单利模式
/// </summary>
/// <value>The get.</value>
public static ConcreteSubject Get()
{
if(instance == null)
{
instance = new ConcreteSubject ();
}
return instance;
}
public void Notify(string state)
{
if (Update != null)
{
// 使用事件来通知给订阅者
Update(state);
}
}
}
创建一个监听着
using System;
using UnityEngine;
public class ConcreteObserver
{
public void GiveInvoice(string state)
{
Console.WriteLine("我是会计,我来开具发票。");
Debug.Log ("===================GiveInvoice==============:"+state);
}
}
使用的时候
ConcreteObserver observer_1 = new ConcreteObserver ();
ConcreteObserver observer_2 = new ConcreteObserver ();
ConcreteSubject.Get ().Update += observer_1.GiveInvoice;
ConcreteSubject.Get ().Update += observer_2.GiveInvoice;