【设计模式】观察者模式

观察者模式(Observer Pattern)

概念:

· 一种行为型设计模式;

· 用于对象间的一对多依赖;

· 适合解耦发布者和订阅者;

UML结构:

复制代码
          ┌───────────┐
          │  Subject  │
          ├───────────┤
          │+ Attach() │
          │+ Detach() │
          │+ Notify() │
          └───────────┘
                ▲
                │
      ┌─────────┴─────────┐
      │                   │
┌─────────────┐     ┌─────────────┐
│ConcreteSubject│     │  Observer   │
└─────────────┘     ├─────────────┤
│- state       │     │+ Update()   │
│+ GetState()  │     └─────────────┘
│+ SetState()  │
└─────────────┘
      ▲
      │
┌─────────────┐
│ConcreteObserver│
└─────────────┘
│- name        │
│+ Update()    │
└─────────────┘

代码示例:

cs 复制代码
/// <summary>
/// 抽象观察者接口
/// </summary>
public interface IObserver
{
    void Receive();
}

/// <summary>
/// 实际的观察者类
/// </summary>
public class ConcreteObserver : IObserver
{
    public string Name { get; set; }

    public void Receive()
    {
        Console.WriteLine($"监听者:{Name},接收到信号");
    }
}

/// <summary>
/// 上下文(也叫被观察者类)
/// </summary>
public class Context
{
    private readonly List<IObserver> listeners = new();

    public void AddListener(IObserver observer)
    {
        if (observer != null && !listeners.Contains(observer))
        {
            listeners.Add(observer);
        }
    }

    public void RemoveListener(IObserver observer)
    {
        listeners.Remove(observer);
    }

    /// <summary>
    /// 通知所管理的观察者
    /// </summary>
    public void Notify()
    {   
        // 使用for循环,避免在遍历时有观察者被移除而发生异常
        for (int i = 0; i < listeners.Count; i++)
        {
            listeners[i].Receive();
        }
    }
}

/// <summary>
/// 客户端
/// </summary>
public class Client
{
    public static void Main()
    {
        IObserver observerA = new ConcreteObserver();
        IObserver observerB = new ConcreteObserver();

        Context context = new Context();

        context.AddListener(observerA);
        context.AddListener(observerB);

        context.Notify();
    }
}

特点:
优点:

· 实现对象之间的松耦合:主题和观察者不直接依赖具体实现;

· 支持广播通信:一个主题可以通知多个观察者;

· 动态灵活:可以随时增加或减少观察者;
缺点:

· 观察者过多会导致性能下降;

· 需要注意对观察者的管理;

· 若观察者之间也需要相互观察,可能会导致无限的循环;

适用场景:

· 事件驱动系统:点击一个按钮,通知其他组件;

· 数据变化通知;

· 消息订阅机制:消息队列、广播系统、游戏状态的更新;

举例场景:

· 游戏中血条的变化;

· 股票价格的涨跌通知;

· 按钮点击的响应;

相关推荐
Once_day几秒前
C++之《程序员自我修养》读书总结(1)
c语言·开发语言·c++·程序员自我修养
喜欢喝果茶.19 分钟前
QOverload<参数列表>::of(&函数名)信号槽
开发语言·qt
亓才孓19 分钟前
[Class类的应用]反射的理解
开发语言·python
努力学编程呀(๑•ี_เ•ี๑)20 分钟前
【在 IntelliJ IDEA 中切换项目 JDK 版本】
java·开发语言·intellij-idea
feasibility.20 分钟前
AI 编程助手进阶指南:从 Claude Code 到 OpenCode 的工程化经验总结
人工智能·经验分享·设计模式·自动化·agi·skills·opencode
向上的车轮36 分钟前
为什么.NET(C#)转 Java 开发时常常在“吐槽”Java:checked exception
java·c#·.net
island131441 分钟前
CANN GE(图引擎)深度解析:计算图优化管线、内存静态规划与异构任务的 Stream 调度机制
开发语言·人工智能·深度学习·神经网络
坚持就完事了1 小时前
Java中的集合
java·开发语言
BD_Marathon1 小时前
七大设计原则介绍
设计模式
魔芋红茶1 小时前
Python 项目版本控制
开发语言·python