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

相关推荐
小白说大模型2 小时前
Python 工程化设计模式:AI 项目中的异步流水线与策略模式实战
人工智能·python·设计模式
choumin4 小时前
行为型模式——中介者模式
c++·设计模式·中介者模式·行为型模式
geovindu21 小时前
Java: Chain of Responsibility Pattern
java·开发语言·后端·设计模式·责任链模式·行为模式
workflower2 天前
装备企业的 AI 路线图
人工智能·深度学习·机器学习·设计模式·机器人
geovindu2 天前
CSharp:Chain of Responsibility Pattern
开发语言·后端·设计模式·c#·.net·责任链模式·行为模式
梓仁沐白2 天前
【Agent 设计模式】路由模式(Routing)
大数据·设计模式
梓仁沐白2 天前
【Agent 设计模式】多智能体协作
microsoft·设计模式·php
努力学习的廖同学2 天前
前端进阶-设计模式
设计模式
workflower3 天前
情境感知系统
人工智能·机器学习·设计模式·自然语言处理·机器人
咖啡八杯3 天前
设计模式中的原则
设计模式·接口隔离原则·里氏替换原则·开闭原则·合成复用原则·单一职责原则