欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 创投人物 > 设计模式之观察者模式

设计模式之观察者模式

2025/5/16 18:26:10 来源:https://blog.csdn.net/qq_47012987/article/details/140413690  浏览:    关键词:设计模式之观察者模式

观察者模式

  • 定义
  • 观察者模式的结构
  • 观察者模式实现
  • 观察者模式的优缺点
    • 优点
    • 缺点
  • 适用场景
  • 总结

定义

观察者模式是一种行为设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。

观察者模式的结构

观察者模式涉及以下几个关键角色:

  • 主题(Subject):状态发生变化的对象。它维护一组观察者,并在状态变化时通知所有观察者。
  • 观察者(Observer):依赖于主题的对象。当主题的状态变化时,观察者会被通知并进行相应的更新。

观察者模式实现

观察者接口(IObserver)

	// 观察者接口public interface IObserver{void Update(string message);}

具体观察者(ConcreteObserver )
舍友是观察者,里面实现了更新方法:

	// 具体观察者public class ConcreteObserver : IObserver{private string _name;private string _doSomething;public ConcreteObserver(string name,string doSomething){_name = name;_doSomething = doSomething;}public void Update(string message){Console.WriteLine($"{_name} 收到 {message},请求:{_doSomething}");}}

主题接口

	// 主题接口public interface ISubject{/*** 增加订阅者* @param observer*/void Attach(IObserver observer);/*** 删除订阅者* @param observer*/void Detach(IObserver observer);/*** 通知订阅者更新消息*/void Notify(String message);}

具体主题实现

	// 具体主题public class ConcreteSubject : ISubject{//储存订阅主题用户private List<IObserver> _observers = new List<IObserver>();//宿舍长下楼了public void DownStairs(){Console.WriteLine("我要下楼了!");Notify("宿舍长要下楼了");}public void Attach(IObserver observer){_observers.Add(observer);}public void Detach(IObserver observer){_observers.Remove(observer);}public void Notify(string message){foreach (var observer in _observers){observer.Update(message);}}}

客户端调用

class Program{static void Main(string[] args){//创建主题宿舍长的行踪ConcreteSubject subject = new ConcreteSubject();//创建订阅者舍友AConcreteObserver observer1 = new ConcreteObserver("李炎","帮我带饭");//创建订阅者舍友BConcreteObserver observer2 = new ConcreteObserver("张力","帮我买瓶水");//订阅宿舍长的行踪subject.Attach(observer1);subject.Attach(observer2);//宿舍长下楼了subject.DownStairs();}}

结果

我要下楼了!
李炎收到宿舍长要下楼了,请求帮忙带饭
张力收到宿舍长要下楼了,请求帮忙买瓶水

观察者模式的优缺点

优点

  • 松耦合:观察者模式实现了对象之间的松耦合,观察者和主题之间没有直接的依赖关系。
  • 可扩展性:可以动态地增加和删除观察者,无需修改主题的代码。
  • 灵活性:可以实现广播通信,主题可以通知多个观察者。

缺点

  • 性能开销:如果观察者较多,通知所有观察者可能会影响性能。
  • 内存泄漏:如果观察者没有被正确移除,可能会导致内存泄漏。
  • 复杂性增加:对于复杂的观察者和主题关系,管理起来会比较复杂。

适用场景

  • 事件驱动系统:例如GUI应用中的事件处理系统。
  • 模型-视图-控制器(MVC)架构:模型的变化需要通知视图更新。
  • 订阅-发布系统:实现发布者和订阅者之间的松耦合。

总结

观察者模式通过定义一对多的依赖关系,使得对象之间的通信变得更加灵活和松耦合。通过接口和具体类的实现,可以实现动态的观察者管理和事件通知。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词