.NET 发布订阅者模式

订阅事件的类(事件订阅者)可以将其方法绑定到事件上,以便在事件触发时执行操作。事件的持有者(事件发布者)在适当的时机触发事件,调用事件委托,从而通知所有订阅者执行相应的操作。
    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}");
        }
    }
评论区
头像