当前位置: 首页 > news >正文

禅城区网站建设电脑买编程代码做网站

禅城区网站建设,电脑买编程代码做网站,wordpress如何添加分类,动感网站模板核心思想 观察者模式是一种行为型设计模式#xff0c;定义了对象之间的一对多依赖关系。当一个对象#xff08;称为Subject#xff0c;主题#xff09;的状态发生改变时#xff0c;所有依赖于它的对象#xff08;称为Observer#xff0c;观察者#xff09;都会自动收到…核心思想 观察者模式是一种行为型设计模式定义了对象之间的一对多依赖关系。当一个对象称为Subject主题的状态发生改变时所有依赖于它的对象称为Observer观察者都会自动收到通知并更新。 **Subject**维护观察者列表提供注册、移除观察者的方法以及通知观察者的功能。 **Observer**定义一个更新接口用于在Subject状态改变时接收通知。 观察者模式的核心是解耦Subject和Observer之间没有直接依赖Subject只需通知Observer而不需要知道Observer的具体实现。 使用场景 事件驱动系统如GUI框架中按钮点击事件通知多个监听器。 发布-订阅模型如消息队列、事件总线。 数据与UI同步如MVC架构中Model变化时自动更新View。 监控系统如系统状态变化时通知多个监控服务。 游戏开发如角色状态变化时通知多个UI组件或AI系统。 解决的问题 紧耦合问题 在传统设计中Subject需要直接调用Observer的方法导致两者紧耦合。观察者模式通过引入Observer接口使Subject和Observer解耦。 动态更新问题 当Subject状态变化时需要手动调用所有依赖对象的更新方法。观察者模式通过notify方法自动通知所有Observer。 可扩展性问题 新增Observer时需要修改Subject的代码。观察者模式允许动态注册和移除Observer无需修改Subject。 示例代码 #include iostream #include list #include memory #include mutex// 观察者接口 class Observer { public:virtual ~Observer() default;virtual void update(const std::string message) 0; };// 主题基类 class Subject { protected:std::liststd::weak_ptrObserver observers; // 使用weak_ptr防止循环引用std::mutex mutex;//多线程环境下需要使用 public:// 添加观察者使用智能指针管理void attach(const std::shared_ptrObserver observer){std::lock_guardstd::mutex lock(mutex);observers.push_back(observer);}// 移除观察者void detach(const std::shared_ptrObserver observer){std::lock_guardstd::mutex lock(mutex);auto it observers.begin();while(it ! observers.end()){//std::weak_ptr的lock()方法返回对应的std::shared_ptrif(observer it-lock()){it observers.erase(it);continue;}it;}}// 通知所有观察者void notify(const std::string message){std::lock_guardstd::mutex lock(mutex);auto it observers.begin();while (it ! observers.end()){//检查观察者是否有效因为观察者有可能在别的地方被清理了if (!it-expired()){//std::weak_ptr的lock()方法返回对应的std::shared_ptr只能通过std::shared_ptr操作管理的对象it-lock()-update(message);it;}else{it observers.erase(it); // 自动清理失效的观察者}}} };// 具体主题新闻发布器 class NewsPublisher : public Subject { public:void publishNews(const std::string news){std::cout publishNews: news std::endl;notify(news); // 通知所有观察者} };// 具体观察者1邮件订阅者 class EmailSubscriber : public Observer { public:~EmailSubscriber(){std::cout EmailSubscriber destroyed std::endl;}void update(const std::string message) override{std::cout EmailSubscriber recive: message std::endl;} };// 具体观察者2短信订阅者 class SMSSubscriber : public Observer { public:~SMSSubscriber(){std::cout SMSSubscriber destroyed std::endl;}void update(const std::string message) override{std::cout SMSSubscriber recive: message std::endl;} };int main() {// 创建主题NewsPublisher publisher;// 创建观察者使用智能指针auto emailSubscriber std::make_sharedEmailSubscriber();auto smsSubscriber std::make_sharedSMSSubscriber();// 注册观察者publisher.attach(emailSubscriber);publisher.attach(smsSubscriber);// 发布新闻通知所有观察者publisher.publishNews(C20 has been published!);// 移除一个观察者publisher.detach(smsSubscriber);publisher.publishNews(designe patten meeting);// 测试观察者自动清理{auto tempSubscriber std::make_sharedEmailSubscriber();publisher.attach(tempSubscriber);publisher.publishNews(temporary news);} // tempSubscriber离开作用域自动解除注册publisher.publishNews(only subscriber recived this message.);return 0; } 运行输出 publishNews: C20 has been published! EmailSubscriber recive: C20 has been published! SMSSubscriber recive: C20 has been published! publishNews: designe patten meeting EmailSubscriber recive: designe patten meeting publishNews: temporary news EmailSubscriber recive: temporary news EmailSubscriber recive: temporary news EmailSubscriber destroyed publishNews: only subscriber recived this message. EmailSubscriber recive: only subscriber recived this message. SMSSubscriber destroyed EmailSubscriber destroyed
http://www.w-s-a.com/news/91569/

相关文章:

  • 权威的唐山网站建设扁平网站欣赏
  • 网站外链建设工作计划应用公园app免费制作
  • 东莞营销型网站建设全自动建站系统
  • 网络在线培训网站建设方案虚拟主机配置WordPress
  • 建设工程信息查询哪个网站好台州做优化
  • wordpress页面回收站位置台州做网站
  • 邢台市行政区划图seo咨询师招聘
  • 外贸网站建设案例网站建设优化开发公司排名
  • 恩施网站优化郑州有没有厉害的seo
  • 电子商务网站建设与管理期末考试题铜山区建设局网站
  • 怎么做非法彩票网站大兴安岭网站建设公司
  • 网站备案授权书模板海外如何淘宝网站建设
  • 网站开发提供源代码dedecms做网站教程
  • 怎么做国际网站首页erp系统一套大概多少钱
  • 做代理网站用什么软件建设网站的企业多少钱
  • 微企免费做网站360收录提交
  • 网站导航页怎么做wordpress数据库批量替换
  • wordpress站点更换域名自己做wordpress 模版
  • 怎么做虚拟的网站东莞常平邮编是多少
  • 电子商务网站和普通网站的区别正规网站建设多少费用
  • 郴州免费招聘网站前端好还是后端好
  • 织梦网站怎样做子域名20个中国风网站设计欣赏
  • wordpress网站搬简约创意logo图片大全
  • 叙述网站制作的流程石家庄58同城最新招聘信息
  • 南昌微信网站建设东莞网站优化软件
  • 爱站数据官网纯静态网站挂马
  • 网站建设公司未来方向3d设计网站
  • 建设部网站 干部学院 一级注册建筑师培训 2014年做网站开发的提成多少钱
  • 网上请人做软件的网站铝合金型材外发加工网
  • 手机网站建设万网山东省作风建设网站