观察者模式
当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。
介绍
意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。
何时使用:一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。
如何解决:使用面向对象技术,可以将这种依赖关系弱化。
关键代码:在抽象类里有一个 ArrayList 存放观察者们。
class Program
{
// 委托充当订阅者接口类
public delegate void NotifyEventHandler(object sender);
// 抽象订阅号类
public class Blog
{
public NotifyEventHandler NotifyEvent;
public string Symbol { get; set; }//描写订阅号的相关信息
public string Info { get; set; }//描写此次update的信息
public Blog(string symbol, string info)
{
this.Symbol = symbol;
this.Info = info;
}
#region 新增对订阅号列表的维护操作
public void AddObserver(NotifyEventHandler ob)
{
NotifyEvent += ob;
}
public void RemoveObserver(NotifyEventHandler ob)
{
NotifyEvent -= ob;
}
#endregion
public void Update()
{
if (NotifyEvent != null)
{
NotifyEvent(this);
}
}
}
// 具体订阅号类
public class MyBlog : Blog
{
public MyBlog(string symbol, string info)
: base(symbol, info)
{
}
}
// 具体订阅者类
public class Subscriber
{
public string Name { get; set; }
public Subscriber(string name)
{
this.Name = name;
}
public void Receive(Object obj)
{
Blog xmfdsh = obj as Blog;
if (xmfdsh != null)
{
Console.WriteLine("订阅者 {0} 观察到了{1}{2}", Name, xmfdsh.Symbol, xmfdsh.Info);
}
}
}
static void Main1(string[] args)
{
Blog xmfdsh = new MyBlog("xmfdsh", "发布了一篇新博客");
Subscriber wnm = new Subscriber("王尼玛");
Subscriber tmr = new Subscriber("唐马儒");
Subscriber wmt = new Subscriber("王蜜桃");
Subscriber anm = new Subscriber("敖尼玛");
// 添加订阅者
xmfdsh.AddObserver(new NotifyEventHandler(wnm.Receive));
xmfdsh.AddObserver(new NotifyEventHandler(tmr.Receive));
xmfdsh.AddObserver(new NotifyEventHandler(wmt.Receive));
xmfdsh.AddObserver(new NotifyEventHandler(anm.Receive));
xmfdsh.Update();
Console.WriteLine();
Console.WriteLine();
Console.WriteLine();
Console.WriteLine();
Console.WriteLine("移除订阅者王尼玛");
xmfdsh.RemoveObserver(new NotifyEventHandler(wnm.Receive));
xmfdsh.Update();
Console.ReadLine();
}
}

本文来自博客园,作者:{春光牛牛,yak},转载请注明原文链接:https://www.cnblogs.com/yakniu/p/16594190.html
欢迎各位大佬们评论指正
QQ讨论群:610129902
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏