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

上海上市公司全部名单太原网站seo外包

上海上市公司全部名单,太原网站seo外包,福田做网站联系电话,摄影网站建设方案观察者模式 (Observer) 观察者模式 是一种行为型设计模式#xff0c;它定义了一种一对多的依赖关系#xff0c;使得当一个对象的状态发生改变时#xff0c;其依赖者#xff08;观察者#xff09;会收到通知并自动更新。 意图 定义对象之间的一对多依赖关系。当一个对象状…观察者模式 (Observer) 观察者模式 是一种行为型设计模式它定义了一种一对多的依赖关系使得当一个对象的状态发生改变时其依赖者观察者会收到通知并自动更新。 意图 定义对象之间的一对多依赖关系。当一个对象状态发生变化时通知所有依赖于它的对象。 使用场景 事件驱动系统 如 GUI 程序中的按钮点击事件按钮通知所有监听器。 数据变化通知 数据模型的变化需要通知多个视图更新。 解耦对象之间的依赖 被观察者与观察者通过接口交互降低了耦合性。 参与者角色 主题 (Subject) 被观察者维护观察者列表并在状态发生变化时通知所有观察者。 观察者 (Observer) 定义了一个接口用于接收通知并更新状态。 具体主题 (ConcreteSubject) 实现具体的主题逻辑存储状态并在状态改变时通知观察者。 具体观察者 (ConcreteObserver) 实现具体的观察者逻辑接收通知并更新状态。 示例代码 以下代码展示了观察者模式的实现使用 C 的现代特性如 std::function、std::vector、shared_ptr。 #include iostream #include vector #include memory #include functional #include string// 观察者接口 class Observer { public:virtual ~Observer() default;virtual void update(const std::string message) 0; // 接收通知 };// 具体观察者实现观察者接口 class ConcreteObserver : public Observer { private:std::string name; // 观察者名称用于标识public:explicit ConcreteObserver(const std::string observerName) : name(observerName) {}void update(const std::string message) override {std::cout 观察者 [ name ] 收到通知: message std::endl;} };// 被观察者接口 class Subject { public:virtual ~Subject() default;virtual void attach(std::shared_ptrObserver observer) 0; // 添加观察者virtual void detach(std::shared_ptrObserver observer) 0; // 移除观察者virtual void notify() 0; // 通知观察者 };// 具体被观察者实现被观察者接口 class ConcreteSubject : public Subject { private:std::vectorstd::shared_ptrObserver observers; // 存储观察者的列表std::string state; // 被观察者的状态public:void attach(std::shared_ptrObserver observer) override {observers.push_back(observer);}void detach(std::shared_ptrObserver observer) override {observers.erase(std::remove(observers.begin(), observers.end(), observer), observers.end());}void setState(const std::string newState) {state newState;notify(); // 状态改变时通知所有观察者}void notify() override {for (const auto observer : observers) {observer-update(state);}} };// 客户端代码 int main() {auto subject std::make_sharedConcreteSubject();// 创建多个观察者auto observer1 std::make_sharedConcreteObserver(Observer1);auto observer2 std::make_sharedConcreteObserver(Observer2);auto observer3 std::make_sharedConcreteObserver(Observer3);// 观察者订阅被观察者subject-attach(observer1);subject-attach(observer2);subject-attach(observer3);// 修改被观察者的状态通知观察者std::cout 修改状态为: 状态A std::endl;subject-setState(状态A);// 移除一个观察者subject-detach(observer2);std::cout 修改状态为: 状态B std::endl;subject-setState(状态B);return 0; }代码解析 1. 观察者接口 (Observer) 定义了一个 update 方法用于接收通知 class Observer { public:virtual ~Observer() default;virtual void update(const std::string message) 0; // 接收通知 };2. 具体观察者 (ConcreteObserver) 实现了 Observer 接口并通过 update 方法更新状态 class ConcreteObserver : public Observer { private:std::string name;public:explicit ConcreteObserver(const std::string observerName) : name(observerName) {}void update(const std::string message) override {std::cout 观察者 [ name ] 收到通知: message std::endl;} };3. 被观察者接口 (Subject) 定义了添加、移除观察者的方法以及通知观察者的 notify 方法 class Subject { public:virtual ~Subject() default;virtual void attach(std::shared_ptrObserver observer) 0;virtual void detach(std::shared_ptrObserver observer) 0;virtual void notify() 0; };4. 具体被观察者 (ConcreteSubject) 存储观察者列表并在状态改变时通知观察者 class ConcreteSubject : public Subject { private:std::vectorstd::shared_ptrObserver observers;std::string state;public:void setState(const std::string newState) {state newState;notify(); // 状态改变时通知所有观察者}void notify() override {for (const auto observer : observers) {observer-update(state);}} };5. 客户端 客户端通过 attach 方法订阅观察者并通过 setState 方法触发通知 auto subject std::make_sharedConcreteSubject(); auto observer1 std::make_sharedConcreteObserver(Observer1); subject-attach(observer1); subject-setState(状态A);优缺点 优点 解耦 被观察者与观察者之间通过接口交互降低了依赖性。 扩展性强 可以轻松增加新的观察者而无需修改被观察者代码。 动态通知 可以在运行时动态添加或移除观察者。 缺点 通知开销 当观察者较多时通知的开销可能较大。 复杂性增加 系统中对象关系变得复杂可能导致调试困难。 适用场景 事件驱动系统 如 GUI 程序、游戏引擎等。 模型-视图结构 数据模型的变化通知视图更新。 分布式系统 如多个服务监听同一个事件源。 总结 观察者模式通过定义一对多的依赖关系解决了对象之间的动态联动问题是事件驱动系统中非常重要的设计模式。
http://www.yingshimen.cn/news/97910/

相关文章:

  • 建设网站开发网站建设策划案
  • 学校定制网站建设公司新闻资讯网站php源码
  • 网站制作与网站设计做网站连接数据库怎么显示图片
  • 网站开发什么比较有创意wordpress 文章底部作者
  • 如何制作餐馆网站给排水管道水压试验方案久久建筑网
  • 做网站的公司找客户阿里云建wordpress
  • 如何在淘宝网做自己的网站美妆销售网站开发的目的
  • 做个英文网站房地产开发公司属于什么行业类别
  • 邢台做wap网站wordpress游戏系统模型
  • 自己做网站需要花钱吗wordpress 免插件实现
  • 云南建设网站温州论坛官方网
  • 东莞网站建设dgjwz国外wordpress主题破解版
  • 学勇建站建设一个小游戏网站
  • 网站设计ui免费正版wordpress主题
  • 陕西省西安市网站建设公司大型门户网站建设费用
  • 网站开发方案报价湖北省住房和城乡建设厅官方网站
  • 洛阳青峰做网站做阿里国际网站要收费吗
  • 做网站坚持原创文章有什么好处如何注册一个自己的网站
  • 现代网站建设门户网站开发公司平台
  • 学做网站前景做网站设计要注意什么问题
  • 大连设计网站公司node怎么做网站
  • 个人备案网站名称怎么写定制开发电商网站建设哪家好
  • 网站一直建设中网站设计的一般流程
  • 西安优化排名推广黑龙江网站建设seo优化
  • 免费企业网站建设哪种辽宁建设工程信息网如何报名
  • 网站原型怎么做wordpress获取子分类
  • 合肥 网站设计营销策划咨询公司
  • 有网站后台模板如何做数据库做1个自己的贷款网站
  • 镇江个人网站制作企业建立自己的网站
  • 郑州 网站建设 东区江西南昌网站建设公司哪家好