设计模式:观察者模式
观察者模式(Observer):定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

{ public abstract class Subject { private IList<Observer> observers = new List<Observer>(); public void Attach(Observer observer) { observers.Add(observer); } public void Detach(Observer observer) { observers.Remove(observer); } public void Notify() { foreach(Observer observer in observers) { observer.Update(); } } } public abstract class Observer { public abstract void Update(); } public class ConcreteSubject : Subject { private string subjectState; public string SubjectState { get { return subjectState; } set { subjectState = value; } } } public class ConcreteObserver:Observer { private string name; private string observerState; private ConcreteSubject subject; public ConcreteObserver(ConcreteSubject subject,string name) { this.subject = subject; this.name = name; } public override void Update() { observerState = subject.SubjectState; Console.WriteLine("观察者{0}的新状态是{1}", name, observerState); } public ConcreteSubject Subject { get { return subject; } set { subject = value; } } } }
测试代码:

ConcreteSubject subject = new ConcreteSubject(); subject.Attach(new ConcreteObserver(subject, "X")); subject.Attach(new ConcreteObserver(subject, "Y")); subject.Attach(new ConcreteObserver(subject, "Z")); subject.SubjectState = "ABC"; subject.Notify();
事件委托:

namespace ObserverDesign { public interface ISubject { string SubjectState { get; set; } void Notify(); } public delegate void HandleMessage(); public class ConcreteSubjectA : ISubject { public string SubjectState { get { return action; } set { action = value ; } } private string action; public event HandleMessage Update; public void Notify() { Update(); } } public class ConcreteSubjectB : ISubject { public string SubjectState { get { return action; } set { action = value; } } private string action; public event EventHandler Update; public void Notify() { Update(); } } public class ObserverA { private string name; private ISubject sub; public ObserverA(string name,ISubject sub) { this.name = name; this.sub = sub; } public void MethodA() { Console.WriteLine("A doing..."); } } public class ObserverB { private string name; private ISubject sub; public ObserverB(string name, ISubject sub) { this.name = name; this.sub = sub; } public void MethodB() { Console.WriteLine("B doing..."); } } }
委托测试代码:

ConcreteSubjectA subject = new ConcreteSubjectA(); ObserverA oa = new ObserverA("A", subject); ObserverB ob = new ObserverB("B", subject); subject.Update += new HandleMessage(oa.MethodA); subject.Update += new HandleMessage(ob.MethodB); subject.SubjectState = "start..."; subject.Notify();
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述