观察者模式(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

相关推荐
佛祖让我来巡山10 小时前
设计模式深度解析:策略模式、责任链模式与模板模式
设计模式·责任链模式·策略模式·模版模式
__万波__11 小时前
二十三种设计模式(三)--抽象工厂模式
java·设计模式·抽象工厂模式
转转技术团队11 小时前
VDOM 编年史
前端·设计模式·前端框架
明洞日记14 小时前
【设计模式手册014】解释器模式 - 语言解释的优雅实现
java·设计模式·解释器模式
ZHE|张恒14 小时前
设计模式(十六)迭代器模式 — 统一访问集合元素的方式,不暴露内部结构
设计模式·迭代器模式
未秃头的程序猿17 小时前
🚀 设计模式在复杂支付系统中的应用:策略+工厂+模板方法模式实战
后端·设计模式
雨中飘荡的记忆18 小时前
深入理解设计模式之单例模式
java·设计模式
8***293120 小时前
能懂!基于Springboot的用户增删查改(三层设计模式)
spring boot·后端·设计模式
在未来等你1 天前
AI Agent设计模式 Day 19:Feedback-Loop模式:反馈循环与自我优化
设计模式·llm·react·ai agent·plan-and-execute
兵bing1 天前
设计模式-访问者模式
设计模式·访问者模式