---------------------------回调机制------------------------------
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);
}