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

相关推荐
Larcher2 天前
AI Loop:让AI像人一样自主完成任务的核心机制
javascript·人工智能·设计模式
咖啡八杯3 天前
GoF设计模式——享元模式
java·spring·设计模式·享元模式
:mnong3 天前
学习创建结构行为设计模式
设计模式
w_t_y_y3 天前
Agent设计模式(四)多模态融合模式(Multi-Modal Fusion)
设计模式
zhouhui0013 天前
订单状态的 if-else 地狱上线就崩——状态模式的工业级落地
设计模式
geovindu3 天前
go: Reactor Pattern
开发语言·后端·设计模式·golang·反应器模式
一只旭宝3 天前
【C++入门精讲22】常见设计模式
c++·设计模式
许彰午4 天前
38_Java设计模式之装饰器模式
java·设计模式·装饰器模式
geovindu4 天前
python: Reactor Pattern
开发语言·python·设计模式·反应器模式