观察者模式(ObserverPattern)

文章目录

1.观察者模式定义

定义一种订阅机制, 可在对象事件发生时通知多个 "观察" 该对象的其他对象

如果你订阅了一份杂志或报纸, 那就不需要再去报摊查询新出版的刊物了。 出版社 (即应用中的 "发布者") 会在刊物出版后 (甚至提前) 直接将最新一期寄送至你的邮箱中。

出版社负责维护订阅者列表, 了解订阅者对哪些刊物感兴趣。 当订阅者希望出版社停止寄送新一期的杂志时, 他们可随时从该列表中退出。

2.UML类图

3.实现代码

观察者:

csharp 复制代码
// 观察者接口
public interface IObserver
{
    void Update(ISubject subject);
}

// 具体观察者A
public class ObserverA : IObserver
{
    public void Update(ISubject subject)
    {
        Console.WriteLine(string.Format("ObserverA observe Subject change:StateNum={0}", (subject as Subject).StateNum));
    }
}

// 具体观察者B
public class ObserverB : IObserver
{
    public void Update(ISubject subject)
    {
        Console.WriteLine(string.Format("ObserverB observe Subject change:StateNum={0}", (subject as Subject).StateNum));
    }
}

被观察者:

csharp 复制代码
// 被观察者接口
public interface ISubject
{
    // 订阅
    void Subscribe(IObserver observer);

    // 取消订阅
    void Unsubscribe(IObserver IObserver);

    // 广播
    void Notify();
}

// 具体被观察者
public class Subject : ISubject
{
    // 状态数字
    public int StateNum{get; set;}

    private List<IObserver> _observables = new List<IObserver>();

    public void Notify()
    {
        StateNum = new Random().Next(0, 10);
        Console.WriteLine(string.Format("StateNum Change:StateNum={0}", StateNum));

        foreach (var observer in _observables)
        {
            observer.Update(this);
        }
    }

    public void Subscribe(IObserver observer)
    {
        _observables.Add(observer);
    }

    public void Unsubscribe(IObserver observer)
    {
        _observables.Remove(observer);
    }
}

使用:

csharp 复制代码
Subject subject = new Subject();
var observeA = new ObserverA();
var observeB = new ObserverB();

subject.Subscribe(observeA);
subject.Subscribe(observeB);
subject.Notify();

subject.Unsubscribe(observeA);
subject.Notify();

StateNum Change:StateNum=2

ObserverA observe Subject change:StateNum=2

ObserverB observe Subject change:StateNum=2

StateNum Change:StateNum=5

ObserverB observe Subject change:StateNum=5

相关推荐
AI人工智能+电脑小能手2 小时前
大白话说Java设计模式-28-模板方法模式(业务实战篇)
java·设计模式·模板方法模式·spring源码·订单系统·代码复用
leeyi6 小时前
两个 Agent 怎么协作:Host-Worker 模式(第91篇-E77)
设计模式·agent·ai编程
AI人工智能+电脑小能手1 天前
大白话说Java设计模式-26-策略模式(业务实战篇)
java·spring·设计模式·策略模式·支付系统·算法切换
星火10241 天前
【Groovy翻译-进阶篇】Groovy 中的设计模式
后端·设计模式·groovy
AI人工智能+电脑小能手1 天前
大白话说Java设计模式-27-策略模式(源码剖析篇)
java·spring·设计模式·策略模式·源码分析·事务管理·comparator
SL_staff1 天前
风控规则如何从硬编码解耦?我们在 JVS-Rules 中的实践与思考
java·spring boot·设计模式
小此方1 天前
Linux加餐(一):藏在Linux中的设计模式(一)策略模式与日志
linux·设计模式·策略模式
To_OC2 天前
从一行入口代码啃透 NestJS:工厂模式、装饰器和依赖注入是怎么串起来的
后端·设计模式·nestjs
东方小月2 天前
从零开发一个 Coding Agent(十二):实现版本化 JSONL 与真实 CLI 入口
前端·设计模式·前端框架
程序员贺加贝2 天前
轻制造SaaS的生产闭环建模-BOM工单领料报工质检与入库
java·设计模式·架构