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