以下是调用事件来实现的一个观察者模式,看懂的话,观察者模式也差不多了,主要还是要上手试试
当我们使用事件来实现观察者模式时,通常会有两个主要部分:一个被观察的对象(Subject),它包含一个或多个事件;以及观察者(Observer),它们订阅这些事件并在事件发生时执行相应的操作。以下是一个简单的使用事件来实现观察者模式的示例:
首先,我们定义观察者接口 IObserver:
public interface IObserver
{
void OnEventRaised(string message);
}
接下来,我们定义被观察对象 Subject,它包含一个事件 EventRaised 和管理观察者列表的功能:
using System;
using System.Collections.Generic;
public class Subject
{
// 事件,当某件事情发生时触发
public event Action<string> EventRaised;
// 观察者列表
private List<IObserver> observers = new List<IObserver>();
// 订阅事件
public void Attach(IObserver observer)
{
observers.Add(observer);
// 当添加新的观察者时,直接订阅事件
EventRaised += observer.OnEventRaised;
}
// 取消订阅事件
public void Detach(IObserver observer)
{
observers.Remove(observer);
// 当移除观察者时,取消订阅事件
EventRaised -= observer.OnEventRaised;
}
// 通知所有观察者
protected virtual void NotifyObservers(string message)
{
// 触发事件
EventRaised?.Invoke(message);
}
// 当有事情发生时,调用此方法
public void RaiseEvent(string message)
{
NotifyObservers(message);
}
}
现在,我们定义一个具体的观察者 ConcreteObserver 类,它实现了 IObserver 接口:
public class ConcreteObserver : IObserver
{
private string name;
public ConcreteObserver(string name)
{
this.name = name;
}
public void OnEventRaised(string message)
{
Console.WriteLine("{0} received message: {1}", name, message);
}
}
最后,我们使用这些类来演示观察者模式的使用:
class Program
{
static void Main(string[] args)
{
// 创建被观察对象
Subject subject = new Subject();
// 创建观察者并订阅事件
IObserver observer1 = new ConcreteObserver("Observer 1");
IObserver observer2 = new ConcreteObserver("Observer 2");
subject.Attach(observer1);
subject.Attach(observer2);
// 触发事件,通知所有观察者
subject.RaiseEvent("Hello from Subject!");
// 取消一个观察者的订阅
subject.Detach(observer1);
// 再次触发事件,这次只有observer2会收到通知
subject.RaiseEvent("Another message from Subject!");
}
}
在这个示例中,Subject 类包含了一个 EventRaised 事件,它用于通知观察者。观察者通过实现 IObserver 接口并定义 OnEventRaised 方法来响应事件。当 Subject 的 RaiseEvent 方法被调用时,它会通过触发 EventRaised 事件来通知所有已订阅的观察者。观察者通过调用 Attach 方法来订阅事件,并通过调用 Detach 方法来取消订阅。
这种实现方式使得 Subject 和 Observer 之间完全解耦,因为观察者通过事件与 Subject 进行交互,而不是直接调用 Subject 的方法。这提高了代码的灵活性和可维护性,使得添加新的观察者或修改事件的通知逻辑变得更加容易。