设计模式系列漫谈之一 - 观察者模式
此文为转载,地址: http://yuyijq.cnblogs.com/
故事
小雪是一个非常漂亮的女孩,漂亮的女孩总是有很多的追求者,而且追求者的队伍在不断的变动,随时有人进入这个队伍,也有人退出。男孩们追求女孩时总是表现出120%的关心,当小雪私自游玩时总是不断收到追求者询问小雪位置变动的消息,小雪也不胜其烦,但小雪是如此的一个善良的女孩,她总是打断自己正常的生活回复男孩们的消息。而男孩们由于要不断的关心小雪的位置变化也弄的精疲力竭,而且还影响正常的工作。
小雪和男孩们的烦恼:
男孩们必须不断的询问小雪的位置变化,从而打断正常的工作小雪也要不断的接受男孩们的询问,有的时候小雪的位置并没有发生变化,还是要不断的回复男孩们的询问。如果给各个男孩们回复问题的方式都不尽相同,小雪还要知道不同的回复方式。
我们给小雪和男孩们提出了解决方案:
建议小雪购买一款带有GPRS功能的手机,该手机保存着所有追求者的电话号码,当该手机检测到小雪的位置发生变化时, 就会向所有追求者通知所在位置。这样一来,男孩们和小雪都各自都可以按照自己正常的生活习惯,只有小雪所在位置发生变化时候才会进行通信。
观察者模式(Observer)的解决方案
观察者模式的思想:观察者模式定义了被观察者与观察者对象之间一对多关系,当被观察者对象的状态发生改变时,多个观察者对象就会接受到通知。
观察者接口如下:
{
public interface IObserver
{
void ShowAddress(string address);
}
}
观察者类如下:
{
public class BoyA : IObserver
{
public void ShowAddress(string address)
{
Console.WriteLine("小雪所在位置:" + address);
}
}
public class BoyB : IObserver
{
public void ShowAddress(string address)
{
Console.WriteLine("小雪所在位置:" + address);
}
}
}
被观察者类如下:
{
public class GPRSMobile
{
private ArrayList boys = new ArrayList(); //观察者列表
public GPRSMobile()
{
}
public void AddBoy(IObserver b)
{
boys.Add(b);
}
//通知所有观察者
private void Notify(string address)
{
for (int i = 0; i < boys.Count; i++)
{
IObserver boy=(IObserver)boys[i];
boy.ShowAddress(address);
}
}
//当位置发生变化时执行
public void OnAddressChanaged(string newAddress)
{
Notify(newAddress);
}
}
}
客户端调用如下:
BoyB boyb=new BoyB();
GPRSMobile mobile=new GRPSMobile()
mobile.AddBoy(boya);
mobile.AddBoy(boyb);
GPRS手机一旦监测所在位置发生变化,立即调用OnAddressChanaged方法发送信息
mobile.OnAddressChanaged("小雪在纽约向你问好!");
【推荐】国内首个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的设计模式综述