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

seo具体怎么优化天津网站优化步骤

seo具体怎么优化,天津网站优化步骤,山东网站建设流程,做网站必看的外国书籍核心思想 观察者模式是一种行为型设计模式,定义了对象之间的一对多依赖关系。当一个对象(称为Subject,主题)的状态发生改变时,所有依赖于它的对象(称为Observer,观察者)都会自动收到…

核心思想

观察者模式是一种行为型设计模式,定义了对象之间的一对多依赖关系。当一个对象(称为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::list<std::weak_ptr<Observer>> observers;  // 使用weak_ptr防止循环引用std::mutex mutex;//多线程环境下需要使用
public:// 添加观察者(使用智能指针管理)void attach(const std::shared_ptr<Observer> observer){std::lock_guard<std::mutex> lock(mutex);observers.push_back(observer);}// 移除观察者void detach(const std::shared_ptr<Observer> observer){std::lock_guard<std::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_guard<std::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_shared<EmailSubscriber>();auto smsSubscriber = std::make_shared<SMSSubscriber>();// 注册观察者publisher.attach(emailSubscriber);publisher.attach(smsSubscriber);// 发布新闻(通知所有观察者)publisher.publishNews("C++20 has been published!");// 移除一个观察者publisher.detach(smsSubscriber);publisher.publishNews("designe patten meeting");// 测试观察者自动清理{auto tempSubscriber = std::make_shared<EmailSubscriber>();publisher.attach(tempSubscriber);publisher.publishNews("temporary news");}  // tempSubscriber离开作用域,自动解除注册publisher.publishNews("only subscriber recived this message.");return 0;
}

运行输出

publishNews: C++20 has been published!
EmailSubscriber recive: C++20 has been published!
SMSSubscriber recive: C++20 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.sczhlp.com/news/134379/

相关文章:

  • 专门做男士用品的网站今天广州出什么大事了
  • 怎么做购物优惠券网站泰州网站建设推广
  • 西安建立公司网站的步骤十大不收费看盘软件网站
  • 期末成绩管理网站开发背景河南省住房城乡建设门户网站
  • 中山做网站费用云南省建设厅网站处长
  • 上海芯片上市公司市值大揭秘!谁是“芯”界顶流?
  • 京东那个做快消的网站php网站开发环境配置
  • 数字货币交易网站开发怎么做母了猜猜看游戏做网站
  • app定制开发网站有哪些做网站要多少钱汉狮
  • 平面设计免费素材网站贷款织梦网站模板
  • 网站结构形式有哪些电商行业
  • 北京网站建设华大二手房公司如何做网站
  • 做国内打不开的网站做网站开发挣钱吗
  • 交易网站开发合同建设部网站职业资格证查询
  • 网站问卷调查系统怎么做宣城有木有专业做网站的
  • 昆明网站seowordpress 媒体库代码
  • 企业网站定位怎么备案域名
  • 深圳网站建设有免费的吗生成静态页面网站源码
  • 多域名一个网站备案罗村网站制作
  • 电子商务网站推广论文石家庄市城乡建设局网站
  • 网站建设电子游戏广告推广平台
  • 网站做淘宝客有什么要求公司网络平台搭建
  • 网站建设:宏智网络科技游戏型网站开发
  • 长春建设银行网站做信息流推广需要建立网站么
  • 深圳高端电商网站建设者开发区招聘网最新招聘
  • 余姚网站建设找哪家织梦儿童早教教育培训网站模板
  • 怎么增加网站流量线上推广渠道
  • 简介网站建设流程wordpress臃肿
  • 暴富建站 网址做网站需要申请专利吗
  • 自己建网站开网店做问卷调查赚钱的网站