观察者模式
- 模式介绍:观察者模式(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!");
// 可以在此处进行其他操作,如移除观察者等
}
}