<设计模式> 观察者模式

观察者模式

  • 模式介绍:观察者模式(Observer Pattern)是一种行为型设计模式,也被称为发布-订阅模式、模型-视图模式、源-收听者模式或从属者模式;它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,其所有依赖者都会收到通知并自动更新。
  • 主要解决的问题:一个对象状态改变时,如何自动通知其他依赖对象的问题,同时保持对象间的低耦合和高协作性。
  • 关键代码:观察者列表:在主题中维护一个观察者列表。

模式结构

Subject(主题/被观察者)

  • 维护一个观察者列表。
  • 提供注册和删除观察者的方法。
  • 当状态发生变化时,向所有注册的观察者发送通知。

Observer(观察者)

  • 提供一个更新接口,以便在得到被观察者状态变化的通知时更新自己。
  • 在被观察者状态变化时接收通知,并执行相应的操作。

应用场景

  • 事件处理:如图形用户界面(GUI)框架中的按钮点击事件、窗口的打开和关闭事件等。
  • 消息通知:如聊天应用、社交媒体平台中的实时消息传递。
  • GUI开发:在图形用户界面开发中,用于处理用户与界面元素的交互事件。
  • 股票市场:股票交易所作为被观察者,股票交易员作为观察者,当股票价格、交易量等发生变化时,交易员将接收到通知。
  • 日志记录:在实时日志记录系统中,日志记录器作为被观察者,观察者可以是日志分析器、报警系统等。

代码实现(AI Code)

1、定义观察者接口(IObserver)

public interface IObserver  
{  
    void Update(string message);  
}

2、 定义主题接口(ISubject)

public interface ISubject  
{  
    void RegisterObserver(IObserver observer);  
    void RemoveObserver(IObserver observer);  
    void NotifyObservers(string message);  
}

3、实现具体主题类

using System.Collections.Generic;  
  
public class ConcreteSubject : ISubject  
{  
    private List<IObserver> observers = new List<IObserver>();  
  
    public void RegisterObserver(IObserver observer)  
    {  
        if (!observers.Contains(observer))  
        {  
            observers.Add(observer);  
        }  
    }  
  
    public void RemoveObserver(IObserver observer)  
    {  
        observers.Remove(observer);  
    }  
  
    public void NotifyObservers(string message)  
    {  
        foreach (IObserver observer in observers)  
        {  
            observer.Update(message);  
        }  
    }  
  
    // 这里可以添加其他业务逻辑,如状态变化的方法  
}

4、实现具体观察者类

public class ConcreteObserver : IObserver  
{  
    private string name;  
  
    public ConcreteObserver(string name)  
    {  
        this.name = name;  
    }  
  
    public void Update(string message)  
    {  
        Console.WriteLine($"{name} received message: {message}");  
    }  
}

5、示例使用

class Program  
{  
    static void Main(string[] args)  
    {  
        ISubject subject = new ConcreteSubject();  
  
        IObserver observer1 = new ConcreteObserver("Observer 1");  
        IObserver observer2 = new ConcreteObserver("Observer 2");  
        IObserver observer3 = new ConcreteObserver("Observer 3");  
  
        subject.RegisterObserver(observer1);  
        subject.RegisterObserver(observer2);  
        subject.RegisterObserver(observer3);  
  
        subject.NotifyObservers("Hello, Observers!");  
  
        // 可以在此处进行其他操作,如移除观察者等  
    }  
}
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值