设计模式--观察者模式
/// <summary>
/// 媒体信息,Subject对象
/// </summary>
public interface IMedia
{
void AddSubscriber(ISubscribr ssb);
void RemoveSubscriber(ISubscribr ssb);
/// <summary>
/// 有新的媒体信息来了,通知订阅者
/// </summary>
void Update();
}
/// <summary>
/// 游戏媒体信息,Subject对象
/// </summary>
public class GameMedia : IMedia
{
private List<ISubscribr> lstSsb = new List<ISubscribr>();
public void AddSubscriber(ISubscribr ssb)
{
lstSsb.Add(ssb);
}
public void RemoveSubscriber(ISubscribr ssb)
{
lstSsb.Remove(ssb);
}
public void Update()
{
foreach (var item in lstSsb)
{
item.Handle("魔兽十大经典战役视频开放下载!");
}
}
}
/// <summary>
/// 体育新闻
/// </summary>
public class SportsMedia : IMedia
{
List<ISubscribr> lstSsb = new List<ISubscribr>();
public void AddSubscriber(ISubscribr ssb)
{
lstSsb.Add(ssb);
}
public void RemoveSubscriber(ISubscribr ssb)
{
lstSsb.Remove(ssb);
}
public void Update()
{
foreach (var item in lstSsb)
{
item.Handle("今天中国夺得第13枚金牌!");
}
}
}
/// <summary>
/// 订阅者,Observer对象
/// </summary>
public interface ISubscribr
{
/// <summary>
/// 订阅者开始处理媒体信息:阅读,记录,或者扔掉
/// </summary>
/// <param name="msg"></param>
void Handle(string msg);
}
public class RssSubsriber : ISubscribr
{
public void Handle(string msg)
{
Console.WriteLine("RSS订阅者正在阅读信息:" + msg);
}
}
public class MobileSubscriber : ISubscribr
{
public void Handle(string msg)
{
Console.WriteLine("手机订阅者正在阅读信息:" + msg);
}
}
public static void ObserverPattern()
{
//消息源,即subject
IMedia gameMedia = new GameMedia();
IMedia sportsMedia = new SportsMedia();
//订阅者,即observer
//rss 订阅了游戏和运动消息
ISubscribr rss = new RssSubsriber();
gameMedia.AddSubscriber(rss);
sportsMedia.AddSubscriber(rss);
//手机订阅者订阅了运动信息
ISubscribr mobile = new MobileSubscriber();
sportsMedia.AddSubscriber(mobile);
//消息更新了,通知相关订阅者
gameMedia.Update();
sportsMedia.Update();
//说明:观察者模式类似一种消息通知机制,一组对象GroupA对另一组对象GroupB表示关注,
//需要在GroupB状态变化时自身有所反应,这时就可以使用观察者模式。
//类似的应用:1,消息通知。2,异常监控
}
/// 媒体信息,Subject对象
/// </summary>
public interface IMedia
{
void AddSubscriber(ISubscribr ssb);
void RemoveSubscriber(ISubscribr ssb);
/// <summary>
/// 有新的媒体信息来了,通知订阅者
/// </summary>
void Update();
}
/// <summary>
/// 游戏媒体信息,Subject对象
/// </summary>
public class GameMedia : IMedia
{
private List<ISubscribr> lstSsb = new List<ISubscribr>();
public void AddSubscriber(ISubscribr ssb)
{
lstSsb.Add(ssb);
}
public void RemoveSubscriber(ISubscribr ssb)
{
lstSsb.Remove(ssb);
}
public void Update()
{
foreach (var item in lstSsb)
{
item.Handle("魔兽十大经典战役视频开放下载!");
}
}
}
/// <summary>
/// 体育新闻
/// </summary>
public class SportsMedia : IMedia
{
List<ISubscribr> lstSsb = new List<ISubscribr>();
public void AddSubscriber(ISubscribr ssb)
{
lstSsb.Add(ssb);
}
public void RemoveSubscriber(ISubscribr ssb)
{
lstSsb.Remove(ssb);
}
public void Update()
{
foreach (var item in lstSsb)
{
item.Handle("今天中国夺得第13枚金牌!");
}
}
}
/// <summary>
/// 订阅者,Observer对象
/// </summary>
public interface ISubscribr
{
/// <summary>
/// 订阅者开始处理媒体信息:阅读,记录,或者扔掉
/// </summary>
/// <param name="msg"></param>
void Handle(string msg);
}
public class RssSubsriber : ISubscribr
{
public void Handle(string msg)
{
Console.WriteLine("RSS订阅者正在阅读信息:" + msg);
}
}
public class MobileSubscriber : ISubscribr
{
public void Handle(string msg)
{
Console.WriteLine("手机订阅者正在阅读信息:" + msg);
}
}
public static void ObserverPattern()
{
//消息源,即subject
IMedia gameMedia = new GameMedia();
IMedia sportsMedia = new SportsMedia();
//订阅者,即observer
//rss 订阅了游戏和运动消息
ISubscribr rss = new RssSubsriber();
gameMedia.AddSubscriber(rss);
sportsMedia.AddSubscriber(rss);
//手机订阅者订阅了运动信息
ISubscribr mobile = new MobileSubscriber();
sportsMedia.AddSubscriber(mobile);
//消息更新了,通知相关订阅者
gameMedia.Update();
sportsMedia.Update();
//说明:观察者模式类似一种消息通知机制,一组对象GroupA对另一组对象GroupB表示关注,
//需要在GroupB状态变化时自身有所反应,这时就可以使用观察者模式。
//类似的应用:1,消息通知。2,异常监控
}
作者:imap
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架