---------------------------回调机制------------------------------
using System;

namespace 委托
{
class Program
{
//委托由于回调函数
public delegate void MyDelegate ();

    public static void CallBackS()
    {
        Console.WriteLine("Start回调函数");
    }
    public static void CallBackU()
    {
        Console.WriteLine("Update回调函数");
    }

    public static void StartLG(MyDelegate dlLink)
    {
        Console.WriteLine("Start逻辑执行完成");
        dlLink?.Invoke();
    }
    public static void UpdateLG(MyDelegate dlLink)
    {
        Console.WriteLine( "Update逻辑执行完成");
        //dlLink?.Invoke();
        dlLink();
    }
    //生命周期主函数
    static void Main(string[] args)
    {
        MyDelegate stCallBack = CallBackS;
        MyDelegate upCallBack = new MyDelegate(CallBackU);
        StartLG(stCallBack);
        UpdateLG(upCallBack);
       
    }
}

}
--------------------------------广播/事件-------------------------------

//广播者
using System;
using System.Collections.Generic;
using System.Text;

namespace 事件__观察者设计模式
{
class Cat//被观察者(广播着)
{
public string name;
public string color;

    public Cat(string name,string color)
    {
        this.name = name;
        this.color = color;
    }

    public void CatComing()
    {
        Console.WriteLine("发起广播");
        if(catCome!=null)
            catCome();
    }

    //public Action catCome;
    public event Action catCome;//声明一个事件,发布一个消息(不能在类的外部被调用)
}

}

//监听者
using System;
using System.Collections.Generic;
using System.Text;

namespace 事件__观察者设计模式
{
class Moust//观察者(监听着)
{
public string name;
public string color;

    public Moust(string name,string color,Cat c)
    {
        this.name = name;
        this.color = color;
        c.catCome += this.MsRuning;//将自身应对广播“某”事件的方法,注册进广播者的该事件中(订阅消息)
        //c.catCome();//**事件不能在类的外部进行调用(委托可以),但可在类的外部注册。因此事件更安全**
    }

    public void MsRuning()
    {
        Console.WriteLine("监听着收到广播");
    }
}

}

//程序
using System;

namespace 事件__观察者设计模式
{
class Program
{
static void Main(string[] args)
{
Cat c = new Cat("Super BuleCat","Blue");
Moust m1 = new Moust("Mk", "Blake",c);//将广播者传入监听者,在监听者中注册委托
//c.catCome += m1.MsRuning;//注册委托
Moust m2 = new Moust("Bt", "Blue",c);
//c.catCome += m2.MsRuning;//注册委托
//c.catCome();//事件不能在类的外部进行调用(委托可以),但可在类的外部注册。
c.CatComing();
}
}
}

例二:
广播者
namespace 事件
{
//可由系统自带无返回值泛型委托代替
public delegate void ChangeEventHandler(object obj, EventArgs e);
class ListWithChangeEvent:ArrayList
{
//public event Action<object, EventArgs> Chaned;
public event ChangeEventHandler Changed;
//发布广播方法:事件链上不为空则执行事件
protected virtual void OnChanged(EventArgs e)
{
if (Changed != null)
Changed(this, e);
//Chaned?.Invoke(this, e);
}
public override int Add(object value)
{
int i = base.Add(value);
OnChanged(EventArgs.Empty);
return i;
}
public override void Clear()
{
base.Clear();
OnChanged(EventArgs.Empty);
}
}
}

监听者
class EventListene
{
private ListWithChangeEvent list;//事件发布者
public EventListene(ListWithChangeEvent list)
{
this.list = list;
//list.Chaned += new ChangeEventHandler(ListChanged);
list.Changed += ListChanged;

    }
    //发布事件时坚挺着调用的方法
    public void ListChanged(object sender, EventArgs e)
    {
        Console.WriteLine("监听到事件");
    }
    public void Detach()
    {
        //list.Chaned -= new ChangeEventHandler(ListChanged);
        list.Changed -= ListChanged;            
        list = null;
    }

}
测试程序
class Program
{
    static void Main(string[] args)
    {
        //广播者
        ListWithChangeEvent list = new ListWithChangeEvent();
        //监听者
        EventListene listene = new EventListene(list);
        list.Add("Item 1");
        list.Clear();
        listene.Detach();
    }
}

例三:
广播者
public class PstPanel : MonoBehaviour ,IEndDragHandler,IBeginDragHandler
{

public Action<int> OnPageChange;//事件/委托链:公开变量用于外部订阅

 public void ScrollToPage(int page)//执行这个方法的“事件”
{
    isMoving = true;
    currentPage =page;
    runTime = 0;
    startPos = rect.horizontalNormalizedPosition;//范围(0~1)

    if(OnPageChange!=null)// OnPageChange?.Invoke(this.currentPage);
    {//作用同于广播此事件(委托连不为空则调用)
        OnPageChange(this.currentPage);
    }
}
监听者
public class UIManager : MonoBehaviour

{
public static UIManager Instence;

private GameObject pstPanel;
private PstPanel evevt;//广播者类
private int currentCount;
// Start is called before the first frame update
private void Awake()
{
    if (Instence!=null)
    {
        Destroy(gameObject);
        return;
    }
    Instence = this;
    DontDestroyOnLoad(gameObject);

    pstPanel = GameObject.Find("PstPanel");//挂着广播者类的游戏中的父物体
    evevt = pstPanel.GetComponentInChildren<PstPanel>();//广播者类
    evevt.OnPageChange += OnPageChnageShow;//将事件发生时要调用的方法添加到广播者的委托链上
}
//事件发生时调用的方法
public void OnPageChnageShow(int index)
{
    Debug.Log("PageChange"+index);
}