订阅事件的类(事件订阅者)可以将其方法绑定到事件上,以便在事件触发时执行操作。事件的持有者(事件发布者)在适当的时机触发事件,调用事件委托,从而通知所有订阅者执行相应的操作。
class Program
{
static void Main(string[] args)
{
EventPublisher eventPublisher = new EventPublisher();
EventSubscriber eventSubscriber = new EventSubscriber();
eventSubscriber.Subscriber(eventPublisher);
eventPublisher.SendMessage(new EventMsg
{
Publisher = "等风来",
State = 0,
Content = "等不到属于自己的风,那就无所谓风"
});
//eventSubscriber.UnSubscriber(eventPublisher);
//Console.WriteLine("取消订阅了");
eventPublisher.SendMessage(new EventMsg
{
Publisher = "等风来",
State = 0,
Content = "等不到属于自己的风,那就无所谓风"
});
}
}
/// <summary>
/// 参数模型,无需关注
/// </summary>
class EventMsg : EventArgs
{
public string Publisher;
public string Content;
public int State;
}
/// <summary>
/// 发布者
/// </summary>
class EventPublisher
{
public delegate void Customer<T>(object sender, T arg);
public event Customer<EventMsg> MessageSent;
public void SendMessage(EventMsg eventMsg)
{
Console.WriteLine($"发送者:{eventMsg.Publisher},发送内容:{eventMsg.Content} 发送状态:{eventMsg.State}");
OnMessageSent(eventMsg);
}
protected void OnMessageSent(EventMsg eventMsg)
{
this.MessageSent?.Invoke(this, eventMsg);
}
}
/// <summary>
/// 订阅者
/// </summary>
class EventSubscriber
{
/// <summary>
/// 订阅
/// </summary>
/// <param name="eventPublisher"></param>
public void Subscriber(EventPublisher eventPublisher)
{
eventPublisher.MessageSent += EventPublisher_MessageSent;
}
/// <summary>
/// 取消订阅
/// </summary>
/// <param name="eventPublisher"></param>
public void UnSubscriber(EventPublisher eventPublisher)
{
eventPublisher.MessageSent -= EventPublisher_MessageSent;
Console.WriteLine("取消订阅成功!!");
}
private void EventPublisher_MessageSent(object sender, EventMsg e)
{
Console.WriteLine($"接受者:{e.Publisher},发送内容:{e.Content} 接收状态:{e.State = 1}");
}
}