23种设计模式-17-观察者模式

mac2026-08-25  10

/// <summary> /// 腾讯(被观察者):腾讯下面也有很多业务(公众号,游戏等等...) /// </summary> public abstract class TengXun { public string Title { get; set; } public string Content { get; set; } /// <summary> /// 存储观察我的人(粉丝) /// </summary> private List<IObserver> ObserverList = new List<IObserver>(); /// <summary> /// 新增观察者(比如有新粉丝关注了我) /// </summary> /// <param name="observer"></param> public void Add(IObserver observer) { Console.WriteLine(observer.Name + "成为了你的新粉丝"); ObserverList.Add(observer); } /// <summary> /// 移除观察者(比如有人取关了我) /// </summary> /// <param name="observer"></param> public void Remove(IObserver observer) { Console.WriteLine(observer.Name + "取消关注了你"); ObserverList.Remove(ObserverList.First(r => r.Name == observer.Name)); } /// <summary> /// 发送消息(我这边发送消息,我会给所有的观察者(粉丝)推送我的消息) /// </summary> public void SendMessage(string title, string content) { this.Title = title; this.Content = content; ObserverList.ForEach(r => r.ReceiveMessage(this)); } } /// <summary> /// 微信公众号(腾讯的一个项目) /// </summary> public class WeChatArticle : TengXun { } /// <summary> /// 和平精英(腾讯游戏) /// </summary> public class PeaceElite : TengXun { } /// <summary> /// 观察者接口 /// </summary> public interface IObserver { string Name { get; set; } /// <summary> /// 观察者接收消息 /// </summary> /// <param name="tengxun"></param> void ReceiveMessage(TengXunEvent tengxun); } /// <summary> /// 微信公众号的粉丝(观察者):观察微信公众号 /// </summary> public class WeChatArticleFans : IObserver { public WeChatArticleFans(string name) { this.Name = name; } public string Name { get; set; } public void ReceiveMessage(TengXunEvent tengxun) { Console.WriteLine("{0}收到了微信公众号推送的一篇文章:标题:{1},内容:{2}", this.Name, tengxun.Title, tengxun.Content); } } /// <summary> /// 腾讯游戏玩家(观察者):观察腾讯游戏 /// </summary> public class TengXunGamer : IObserver { public TengXunGamer(string name) { this.Name = name; } public string Name { get; set; } public void ReceiveMessage(TengXunEvent tengxun) { Console.WriteLine("{0}收到了和平精英推送的一条消息:标题:{1},内容:{2}", this.Name, tengxun.Title, tengxun.Content); } } private static void TestCommon() { //初始化被观察者(微信公众号) TengXun wechatArticle = new WeChatArticle(); //初始化被观察者(和平精英) TengXun game = new PeaceElite(); //给微信公众号添加粉丝(观察者) wechatArticle.Add(new WeChatArticleFans("微信公众号粉丝:张三")); wechatArticle.Add(new WeChatArticleFans("微信公众号粉丝:李四")); wechatArticle.Add(new WeChatArticleFans("微信公众号粉丝:王五")); wechatArticle.Add(new WeChatArticleFans("微信公众号粉丝:赵柳")); Console.WriteLine("----------------------------------------------------------"); //给和平精英添加玩家(观察者) game.Add(new TengXunGamer("和平精英玩家:张无忌")); game.Add(new TengXunGamer("和平精英玩家:秋刀")); game.Add(new TengXunGamer("和平精英玩家:琅琊榜")); game.Add(new TengXunGamer("和平精英玩家:金箍棒")); game.Add(new TengXunGamer("和平精英玩家:紧箍咒")); Console.WriteLine("----------------------------------------------------------"); //微信公众号发通知(发表新文章) wechatArticle.SendMessage("一篇新文章", "来学习设计模式至观察者模式吧"); Console.WriteLine("----------------------------------------------------------"); //和平精英发通知(新动态) game.SendMessage("和平精英更新啦", "新玩法:火力模式,精英们快来保卫和平吧!"); Console.WriteLine("----------------------------------------------------------"); //取消关注 game.Remove(new TengXunGamer("和平精英玩家:张无忌")); Console.WriteLine("----------------------------------------------------------"); //再发送新的通知,取消关注的人就收不到推送了 game.SendMessage("(和平精英)您有一条新消息", "万圣节,大家放开嗨"); Console.WriteLine("----------------------------------------------------------"); }

 

 

事件实现

public abstract class TengXunEvent { public string Title { get; set; } public string Content { get; set; } /// <summary> /// 存储观察我的人(粉丝) /// </summary> private event NotifyEventHandler ObserverEvent; /// <summary> /// 新增观察者(比如有新粉丝关注了我) /// </summary> /// <param name="observerEventHandler"></param> public void Add(NotifyEventHandler observerEventHandler) { ObserverEvent += observerEventHandler; } /// <summary> /// 移除观察者(比如有人取关了我) /// </summary> /// <param name="observerEventHandler"></param> public void Remove(NotifyEventHandler observerEventHandler) { ObserverEvent -= observerEventHandler; } /// <summary> /// 发送消息(我这边发送消息,我会给所有的观察者(粉丝)推送我的消息) /// </summary> public void SendMessage(string title, string content) { this.Title = title; this.Content = content; ObserverEvent(this); } } public delegate void NotifyEventHandler(TengXunEvent tengxun); /// <summary> /// 微信公众号(腾讯的一个项目) /// </summary> public class WeChatArticle : TengXunEvent { } /// <summary> /// 和平精英(腾讯游戏) /// </summary> public class PeaceElite : TengXunEvent { }

观察者接口和实现类都不用修改

private static void TestEvent() { //初始化被观察者(微信公众号) TengXunEvent wechatArticle = new WeChatArticle(); //初始化被观察者(和平精英) TengXunEvent game = new PeaceElite(); //给微信公众号添加粉丝(观察者) wechatArticle.Add(new WeChatArticleFans("微信公众号粉丝:张三").ReceiveMessage); wechatArticle.Add(new WeChatArticleFans("微信公众号粉丝:李四").ReceiveMessage); wechatArticle.Add(new WeChatArticleFans("微信公众号粉丝:王五").ReceiveMessage); wechatArticle.Add(new WeChatArticleFans("微信公众号粉丝:赵柳").ReceiveMessage); Console.WriteLine("----------------------------------------------------------"); //给和平精英添加玩家(观察者) game.Add(new TengXunGamer("和平精英玩家:张无忌").ReceiveMessage); game.Add(new TengXunGamer("和平精英玩家:秋刀").ReceiveMessage); game.Add(new TengXunGamer("和平精英玩家:琅琊榜").ReceiveMessage); game.Add(new TengXunGamer("和平精英玩家:金箍棒").ReceiveMessage); game.Add(new TengXunGamer("和平精英玩家:紧箍咒").ReceiveMessage); Console.WriteLine("----------------------------------------------------------"); //微信公众号发通知(发表新文章) wechatArticle.SendMessage("一篇新文章", "来学习设计模式至观察者模式吧"); Console.WriteLine("----------------------------------------------------------"); //和平精英发通知(新动态) game.SendMessage("和平精英更新啦", "新玩法:火力模式,精英们快来保卫和平吧!"); Console.WriteLine("----------------------------------------------------------"); //取消关注 game.Remove(new TengXunGamer("和平精英玩家:张无忌").ReceiveMessage); Console.WriteLine("----------------------------------------------------------"); //再发送新的通知,取消关注的人就收不到推送了 game.SendMessage("(和平精英)您有一条新消息", "万圣节,大家放开嗨"); Console.WriteLine("----------------------------------------------------------"); }

 

 

Program

class Program { /// <summary> /// 观察者模式: /// 生活中处处可见观察者模式,例如: /// 微博,如果我发送一篇微博,系统得把我发送的新微博推送给我的每一个粉丝 /// 微信公众号,公众号发送一篇文章,系统会把这篇文章推送给所有关注该公众号的用户 /// ......很多很多 /// /// 像这样子的一对多的关系,我们都可以使用观察者模式去实现它 /// 观察者模式分为:1.观察者;2.被观察者 /// /// 在上面的例子中,观察者就是那些粉丝们(多个),被观察者就是微信公众号或者我本人(一个) /// 他们一直观察着,一旦被观察者发生变化(发送微博/文章),观察者会立马做出响应(推送微博/文章) /// /// 此文中我会用两种方式去实现观察者模式: /// 1.常规实现:基本所有开发语言都可以去实现观察者模式 /// 2..Net方式实现:基于.Net里面的事件机制去实现观察者模式 /// </summary> /// <param name="args"></param> static void Main(string[] args) { //第一种方式 //TestCommon(); //第二种方式:.Net事件 TestEvent(); Console.WriteLine("End"); Console.ReadKey(); } private static void TestCommon() { //初始化被观察者(微信公众号) TengXun wechatArticle = new WeChatArticle(); //初始化被观察者(和平精英) TengXun game = new PeaceElite(); //给微信公众号添加粉丝(观察者) wechatArticle.Add(new WeChatArticleFans("微信公众号粉丝:张三")); wechatArticle.Add(new WeChatArticleFans("微信公众号粉丝:李四")); wechatArticle.Add(new WeChatArticleFans("微信公众号粉丝:王五")); wechatArticle.Add(new WeChatArticleFans("微信公众号粉丝:赵柳")); Console.WriteLine("----------------------------------------------------------"); //给和平精英添加玩家(观察者) game.Add(new TengXunGamer("和平精英玩家:张无忌")); game.Add(new TengXunGamer("和平精英玩家:秋刀")); game.Add(new TengXunGamer("和平精英玩家:琅琊榜")); game.Add(new TengXunGamer("和平精英玩家:金箍棒")); game.Add(new TengXunGamer("和平精英玩家:紧箍咒")); Console.WriteLine("----------------------------------------------------------"); //微信公众号发通知(发表新文章) wechatArticle.SendMessage("一篇新文章", "来学习设计模式至观察者模式吧"); Console.WriteLine("----------------------------------------------------------"); //和平精英发通知(新动态) game.SendMessage("和平精英更新啦", "新玩法:火力模式,精英们快来保卫和平吧!"); Console.WriteLine("----------------------------------------------------------"); //取消关注 game.Remove(new TengXunGamer("和平精英玩家:张无忌")); Console.WriteLine("----------------------------------------------------------"); //再发送新的通知,取消关注的人就收不到推送了 game.SendMessage("(和平精英)您有一条新消息", "万圣节,大家放开嗨"); Console.WriteLine("----------------------------------------------------------"); } private static void TestEvent() { //初始化被观察者(微信公众号) TengXunEvent wechatArticle = new WeChatArticle(); //初始化被观察者(和平精英) TengXunEvent game = new PeaceElite(); //给微信公众号添加粉丝(观察者) wechatArticle.Add(new WeChatArticleFans("微信公众号粉丝:张三").ReceiveMessage); wechatArticle.Add(new WeChatArticleFans("微信公众号粉丝:李四").ReceiveMessage); wechatArticle.Add(new WeChatArticleFans("微信公众号粉丝:王五").ReceiveMessage); wechatArticle.Add(new WeChatArticleFans("微信公众号粉丝:赵柳").ReceiveMessage); Console.WriteLine("----------------------------------------------------------"); //给和平精英添加玩家(观察者) game.Add(new TengXunGamer("和平精英玩家:张无忌").ReceiveMessage); game.Add(new TengXunGamer("和平精英玩家:秋刀").ReceiveMessage); game.Add(new TengXunGamer("和平精英玩家:琅琊榜").ReceiveMessage); game.Add(new TengXunGamer("和平精英玩家:金箍棒").ReceiveMessage); game.Add(new TengXunGamer("和平精英玩家:紧箍咒").ReceiveMessage); Console.WriteLine("----------------------------------------------------------"); //微信公众号发通知(发表新文章) wechatArticle.SendMessage("一篇新文章", "来学习设计模式至观察者模式吧"); Console.WriteLine("----------------------------------------------------------"); //和平精英发通知(新动态) game.SendMessage("和平精英更新啦", "新玩法:火力模式,精英们快来保卫和平吧!"); Console.WriteLine("----------------------------------------------------------"); //取消关注 game.Remove(new TengXunGamer("和平精英玩家:张无忌").ReceiveMessage); Console.WriteLine("----------------------------------------------------------"); //再发送新的通知,取消关注的人就收不到推送了 game.SendMessage("(和平精英)您有一条新消息", "万圣节,大家放开嗨"); Console.WriteLine("----------------------------------------------------------"); } }

 

最新回复(0)