12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- 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<IObserver> observers = new List<IObserver>();
- 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);
- }
- }
- }
|