using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApp { // 定义观察者接口 public interface IObserver { void OnUpdate(string message); } // 主题类 public class Subject { //观察者队列 private List observers = new List(); private string state; // 委托类型,用于表示通知方法 public delegate void NotifyHandler(string message); public event NotifyHandler OnNotify; // 注册观察者 public void RegisterObserver(IObserver observer) { observers.Add(observer); // 使用委托订阅事件(这一步是可选的,因为我们会直接调用OnNotify) // OnNotify += observer.OnUpdate; // 这种方式需要在注销时取消订阅 } // 注销观察者 public void UnregisterObserver(IObserver observer) { observers.Remove(observer); // 使用委托取消订阅事件(如果使用上面注释的代码) // OnNotify -= observer.OnUpdate; } // 通知所有观察者 protected virtual void NotifyObservers() { string message = $"输出信息: {state}"; // 使用事件通知(这种方式更符合事件的使用习惯) OnNotify?.Invoke(message); } // 设置状态并通知观察者 public void SetState(string newState) { state = newState; NotifyObservers(); } // 初始化事件(可选,可以在构造函数中做) public Subject() { //注册通知观察者的委托事件 OnNotify += (message) => { foreach (var observer in observers) { //调用所有观察者的观察事件 observer.OnUpdate(message); } }; } } public class ConcreteObserverA : IObserver { public void OnUpdate(string message) { Console.WriteLine("观察者A输出: " + message); } } public class ConcreteObserverB : IObserver { public void OnUpdate(string message) { Console.WriteLine("观察者B输出: " + message); } } }