观察者模式

观察者模式:定义了一种一对多的依赖关系,一个对象的行为引发多个对象的行为.让多个观察者绑定一个通知者。

当通知者的状态发生变化时候,会通知所有注册到通知者里面的观察者,使他们能够自动更新自己。

它是行为模式的一种,解决了具有一对多依赖关系的对象的重用问题。

以Socket通信为例,多个客户端绑定服务器IP和端口,注册到服务端中,那么服务器端与客户端就是一对多的关系。(观察者和通知者互相依赖)

通信,不是服务端和客户端直接通信,而是服务器端收到信号,进行转发(通知),客户端更新自己。和打电话是一个道理。

C#代码示例:

namespace 观察者模式
{
    class Program
    {
        static void Main(string[] args)
        {
            //具体通知者(Server)
            ConcreteNotifier notifier = new ConcreteNotifier();
            //具体观察者(Client)注册到具体通知者(Server)中
            ConcreteObserver client1 = new ConcreteObserver(notifier, "Client1");
            ConcreteObserver client2 = new ConcreteObserver(notifier, "Client2");
            notifier.Attach(client1,client2);
            notifier.Notify();
            Console.WriteLine("服务端(通知者)更新状态:");
            notifier.State = "收到服务端消息...";
            notifier.Notify();
        }
    }
    //抽象观察者
    public interface IObserver
    {
        void Notify();
    }
    //具体观察者(客户端):接收通知
    public class ConcreteObserver : IObserver
    {
        private ConcreteNotifier notifier;
        private string name;
        /// <summary>
        /// 具体观察者
        /// </summary>
        /// <param name="notifier">注册到具体通知者</param>
        /// <param name="name">观察着名称</param>
        public ConcreteObserver(ConcreteNotifier notifier, string name)
        {
            this.notifier = notifier;
            this.name = name;
            notifier.State = "默认";
        }
        public void Notify()
        {
            Console.WriteLine("观察者:{0} 状态是:{1}", name, this.notifier.State);
        }
    }
    //抽象通知者
    public interface INotifier
    {
        void Attach(params IObserver[] observer);
        void Notify();
    }
    //实现通知者功能
    public class Notifier : INotifier
    {
        private List<IObserver> observers = new List<IObserver>();
        public void Attach(params IObserver[] observer)
        {
            foreach (var o in observer)
            {
                observers.Add(o);
            }
        }
        //观察者通知每个通知者
        public void Notify()
        {
            foreach (var observer in observers)
            {
                observer.Notify();
            }
        }
    }
    //具体通知者(服务端):发送通知
    public class ConcreteNotifier : Notifier
    {
        public string State { get; set; }   //状态
    }
}

运行结果:


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值