浅谈观察者模式
浅谈观察者模式
观察者模式
定义
指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式,它是对象行为型模式。
举一个常见的例子
有这样一个例子:
某些顾客对某商店的产品很感兴趣(例如苹果十三香),顾客可以每天来查看是否到货,大多数情况会空手而归。
当然商店可以通知顾客到货了,但是很可能被顾客认为故意骚扰。
我们可以让感兴趣的顾客(观察者)告诉商店(发布者),当十三香到货了,商店(发布者)就会通知顾客(观察者)。
关键对象
发布者:要将自身的状态改变通知给其他对象.
观察者:希望关注(订阅)发布者状态变化的对象.
抽象
当顾客甲(观察者 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]
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!