观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象发生变化时,它的所有观察者都会收到通知并自动更新。
观察者模式包含以下几个角色:
观察者模式适用于以下情况:
以下是一些可能的应用场景:
在一个消息订阅与发布系统中,可以使用观察者模式来实现消息的订阅和发布。主题对象负责维护订阅者列表,并在消息发布时通知所有订阅者。
在一个股票交易系统中,可以使用观察者模式来实现股票行情的实时通知。主题对象负责维护股票行情,并在行情变化时通知所有观察者。
在一个游戏中,可以使用观察者模式来实现游戏事件的通知。主题对象负责维护游戏事件,并在事件发生时通知所有观察者。
我们需要定义一个观察者接口IObserver,其中包含接收通知并做出处理的方法:
C#public interface IObserver
{
void Update();
}
我们有一个名为Subject
的主题接口,其中包含添加、删除和通知观察者的方法:
C#public interface ISubject
{
void Attach(IObserver observer);
void Detach(IObserver observer);
void Notify();
}
我们可以创建一个具体主题类ConcreteSubject
,实现ISubject
接口,并在其中维护一个观察者对象的集合,并在状态变化时通知观察者:
C#public class ConcreteSubject : ISubject
{
private List<IObserver> _observers = new List<IObserver>();
private string _state;
public string State
{
get { return _state; }
set
{
_state = value;
Notify();
}
}
public void Attach(IObserver observer)
{
_observers.Add(observer);
}
public void Detach(IObserver observer)
{
_observers.Remove(observer);
}
public void Notify()
{
foreach (var observer in _observers)
{
observer.Update();
}
}
}
我们可以创建一个具体观察者类ConcreteObserver
,实现IObserver
接口,并在Update()
方法中做出具体的处理逻辑:
C#public class ConcreteObserver : IObserver
{
private string _name;
private ConcreteSubject _subject;
public ConcreteObserver(string name, ConcreteSubject subject)
{
_name = name;
_subject = subject;
}
public void Update()
{
Console.WriteLine($"{_name} received notification: {_subject.State}");
}
}
我们可以在客户端代码中使用观察者模式来实现主题和观察者之间的通信:
C#static void Main(string[] args)
{
var subject = new ConcreteSubject();
var observer1 = new ConcreteObserver("Observer 1", subject);
var observer2 = new ConcreteObserver("Observer 2", subject);
subject.Attach(observer1);
subject.Attach(observer2);
subject.State = "State 1";
subject.State = "State 2";
subject.Detach(observer2);
subject.State = "State 3";
}
观察者模式是一种实现对象之间松耦合关系的有效方式,它能够提供一种简单而灵活的通信机制。通过使用观察者模式,可以实现对象之间的动态关联,并且能够在运行时动态添加和删除观察者。
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!