观察者模式
2023-10-20 10:46 子凡。翅膀 阅读(22) 评论(0) 编辑 收藏 举报定义:对象之间一对多的依赖关系,当对象发生改变时,其依赖对象都得到通知并自动更新。也被称为发布/订阅模式。
特点:
- 抽象主题:将所有的观察者的引用保存到一个集合内,每个主题内保存着观察者,并提供一个接口进行对观察者的删除添加。
- 具体主题:将有关状态存入具体观察者对象,当具体主题发生变化时,给所有观察者发送通知消息。
- 抽象观察者:为所有的具体观察者定义接口,得到主题通知时更新。
- 具体观察者:实现抽象观察者所要求的的更新接口,使本身状态主题协调。
优点:降低耦合性,观察者与被观察者通过抽象解耦。
缺点:时间复杂度增高,当有多个观察者时会增加时间复杂度。
内连不足,
容易出现循环调用
1 // 订阅号抽象类 2 public abstract class Blog 3 { 4 // 保存订阅者列表 5 private List observers = new Listbserver>(); 6 7 public string Symbol { get; set; }//描写订阅号的相关信息 8 public string Info { get; set; }//描写此次update的信息 9 public Blog(string symbol, string info) 10 { 11 this.Symbol = symbol; 12 this.Info = info; 13 } 14 15 // 对同一个订阅号,新增和删除订阅者的操作 16 public void AddObserver(IObserver ob) 17 { 18 observers.Add(ob); 19 } 20 public void RemoveObserver(IObserver ob) 21 { 22 observers.Remove(ob); 23 } 24 25 public void Update() 26 { 27 // 遍历订阅者列表进行通知 28 foreach (IObserver ob in observers) 29 { 30 if (ob != null) 31 { 32 ob.Receive(this); 33 } 34 } 35 } 36 } 37 38 // 具体订阅号类 39 public class MyBlog : Blog 40 { 41 public MyBlog(string symbol, string info) 42 : base(symbol, info) 43 { 44 } 45 } 46 47 // 订阅者接口 48 public interface IObserver 49 { 50 void Receive(Blog tenxun); 51 } 52 53 // 具体的订阅者类 54 public class Subscriber : IObserver 55 { 56 public string Name { get; set; } 57 public Subscriber(string name) 58 { 59 this.Name = name; 60 } 61 62 public void Receive(Blog xmfdsh) 63 { 64 Console.WriteLine("订阅者 {0} 观察到了{1}{2}", Name, xmfdsh.Symbol, xmfdsh.Info); 65 } 66 } 67 68 // 客户端测试 69 class Program 70 { 71 static void Main(string[] args) 72 { 73 Blog xmfdsh = new MyBlog("xmfdsh", "发布了一篇新博客"); 74 75 // 添加订阅者 76 xmfdsh.AddObserver(new Subscriber("王尼玛")); 77 xmfdsh.AddObserver(new Subscriber("唐马儒")); 78 xmfdsh.AddObserver(new Subscriber("王蜜桃")); 79 xmfdsh.AddObserver(new Subscriber("敖尼玛")); 80 81 //更新信息 82 xmfdsh.Update(); 83 //输出结果,此时所有的订阅者都已经得到博客的新消息 84 Console.ReadLine(); 85 } 86 } 87
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理