浅谈观察者模式

浅谈观察者模式

观察者模式

定义

指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式,它是对象行为型模式。

举一个常见的例子

有这样一个例子:

某些顾客对某商店的产品很感兴趣(例如苹果十三香),顾客可以每天来查看是否到货,大多数情况会空手而归。
当然商店可以通知顾客到货了,但是很可能被顾客认为故意骚扰。
我们可以让感兴趣的顾客(观察者)告诉商店(发布者),当十三香到货了,商店(发布者)就会通知顾客(观察者)。

关键对象

发布者:要将自身的状态改变通知给其他对象.
观察者:希望关注(订阅)发布者状态变化的对象.

抽象

当顾客甲(观察者 A)通过邮件方式告诉商店,顾客乙(观察者 B)通过 XX 方式告诉商店,商店(发布者)就会存在严重的资源浪费(发布者不得不处理不同的订阅方式)。
所以我们需要一个规范(观察者接口)

主要对象

观察者接口(Observer):它是一个抽象类或接口,它包含了一个更新自己的抽象方法,当接到Publisher的更改通知时被调用。
具体观察者(Concrete Observer):实现抽象观察者中接口定义的方法,以便在得到目标的更改通知时更新自身的状态。
发布者(Publisher):被观察的目标,它实现通知方法,当内部状态发生改变时,通知所有注册过的观察者对象。

C#简单代码示例

点击查看代码
//订阅者
    public class Publisher
    {
        public List<IObserver> Observers { get; set; } = new List<IObserver>();


        //订阅(这个方法名是为了好理解,一般方法名为Subscribe)
        //其实在观察者模式中,由Publisher和observer实现订阅都可以。
        public void AddObserver(IObserver observer)
        {
            Console.WriteLine($"Publisher: I'm Add {observer.GetType().Name}");
            this.Observers.Add(observer);
        }
        //取消订阅(这个方法名是为了好理解,一般方法名为UnSubscribe)
        public void DeleteObserver(IObserver observer)
        {
            Console.WriteLine($"Publisher: I'm Delete {observer.GetType().Name}");
            this.Observers.Remove(observer);
        }

        //通知
        private void Notify()
        {
             Console.WriteLine("Publisher: 我到货了");
            foreach (var item in Observers)
            {
                item.onGetNotify(this);
            }
        }

    }

    //观察者接口(Observer)
    public interface IObserver
    {
        //收到通知时做出的反应(这个方法名是为了好理解,一般方法名为next)
        public void onGetNotify(Publisher publisher);
    }

    public class ObserverA : IObserver
    {
        public void onGetNotify(Publisher publisher)
        {
            System.Console.WriteLine($"{this.GetType().Name} 我知道了");
        }
    }

    public class ObserverB : IObserver
    {
        public void onGetNotify(Publisher publisher)
        {
            System.Console.WriteLine($"{this.GetType().Name} 我知道了");
        }
    }

调用代码

点击查看代码
        var publisher = new Publisher();
        var observerA = new ObserverA();
        var observerB = new ObserverB();
        publisher.AddObserver(observerA);
        publisher.AddObserver(observerB);
        publisher.Notify();
        publisher.DeleteObserver(observerA);
        publisher.Notify();
        publisher.DeleteObserver(observerB);
        publisher.Notify();

运行结果:

.net中的Observe

.net中提供了两个接口,方便开发者创建观察者模式

IObserver<T> 提供用于接收基于推送的通知的机制。(发布者)
IObservable<T> 定义基于推送的通知的提供程序。(观察者)

MSDN文档非常详尽我这里就不一一赘述了。感兴趣的可以看看[https://docs.microsoft.com/zh-cn/dotnet/api/system.iobserver-1?view=net-6.0]

posted @ 2022-01-29 10:34  花里逢君别  阅读(81)  评论(0编辑  收藏  举报