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

巴中微网站建设规模以上工业企业奖励

巴中微网站建设,规模以上工业企业奖励,59做网站,重庆建设工程安全管理协会网站1. 引言 在 C 软件与设计系列课程中,观察者模式是一个重要的设计模式。本系列课程旨在深入探讨该模式的实现与优化。在之前的课程里,我们已对观察者模式有了初步认识,本次将在前两次课程的基础上,进一步深入研究,着重…

在这里插入图片描述

1. 引言

在 C++ 软件与设计系列课程中,观察者模式是一个重要的设计模式。本系列课程旨在深入探讨该模式的实现与优化。在之前的课程里,我们已对观察者模式有了初步认识,本次将在前两次课程的基础上,进一步深入研究,着重解决观察者生命周期问题,提升代码的安全性、灵活性、可维护性和扩展性。

2. 观察者模式基础回顾

2.1 基本概念

观察者模式包含主题(Subject)和观察者(Observer)两个核心概念。主题负责管理观察者列表,当主题发生有趣的事情时,会通知列表中的所有观察者。观察者则关注主题的状态变化,当收到通知时会做出相应的反应。

2.2 首次实现

首次实现中,我们创建了主题和观察者类。主题类可以添加、移除观察者,并在状态变化时通知所有观察者。使用 std::forward_list 存储观察者指针,通过遍历列表调用每个观察者的 notify 函数。示例代码创建了一个主题和三个观察者,展示了添加、通知和移除观察者的过程。

#include <iostream>
#include <forward_list>// 观察者类
class Observer {
public:virtual void notify() = 0;virtual ~Observer() = default;
};// 主题类
class Subject {
private:std::forward_list<Observer*> observers;
public:void addObserver(Observer* observer) {observers.push_front(observer);}void removeObserver(Observer* observer) {observers.remove(observer);}void notifyAll() {for (auto observer : observers) {observer->notify();}}
};// 具体观察者类
class ConcreteObserver : public Observer {
public:void notify() override {std::cout << "ConcreteObserver notified." << std::endl;}
};

2.3 首次实现的优缺点

优点是基本实现了观察者模式的功能,逻辑较为清晰。缺点是灵活性不足,若要创建更多的观察者和主题,需要创建不同的具体类,缺乏扩展性。

3. 改进实现:添加接口提升扩展性

3.1 改进思路

为了提高代码的灵活性和可扩展性,第二次实现为主题和观察者添加了接口。在 C++ 中,通过创建基类(类似抽象类)来实现接口的功能。

3.2 主题接口(ISubject)和观察者接口(IObserver)

// 观察者接口
class IObserver {
public:virtual void onNotify() = 0;virtual ~IObserver() = default;
};// 主题接口
class ISubject {
public:virtual void attach(IObserver* observer) = 0;virtual void detach(IObserver* observer) = 0;virtual void notifyAll() = 0;virtual ~ISubject() = default;
};

3.3 具体实现类

3.3.1 具体观察者类(Watcher)
#include <iostream>
#include <string>class Watcher : public IObserver {
private:std::string m_name;
public:explicit Watcher(const std::string& name) : m_name(name) {}void onNotify() override {std::cout << "Watcher - " << m_name << std::endl;}
};
3.3.2 具体主题类(SomeSubject)
#include <forward_list>class SomeSubject : public ISubject {
private:std::forward_list<IObserver*> m_observers;
public:void attach(IObserver* observer) override {m_observers.push_front(observer);}void detach(IObserver* observer) override {m_observers.remove(observer);}void notifyAll() override {for (auto observer : m_observers) {observer->onNotify();}}
};

3.4 测试代码

int main() {SomeSubject subject;Watcher watcher1("Watcher-1");Watcher watcher2("Watcher-2");Watcher watcher3("Watcher-3");subject.attach(&watcher1);subject.attach(&watcher2);subject.attach(&watcher3);subject.notifyAll();subject.detach(&watcher3);std::cout << std::endl;subject.notifyAll();return 0;
}

3.5 改进后的优点

通过使用接口,现在可以创建不同类型的主题和观察者类,只要它们继承自相应的接口并实现必要的函数。这使得代码更加灵活,可以轻松扩展以适应不同的需求。同时,接口的引入使得代码结构更加清晰,不同的功能被封装在不同的类中,提高了可维护性。

4. 解决观察者生命周期问题:利用 RAII 技术

4.1 问题提出

在现有代码中,若一个观察者超出作用域被销毁,但仍存在于主题的观察者列表中,当主题调用 notifyAll 时,会尝试访问已销毁的对象,从而导致运行时错误。

4.2 利用 RAII 解决问题

4.2.1 思路

RAII 是 C++ 的重要特性,通过对象的构造和析构自动管理资源。我们可以利用这一特性,在 Watcher 的构造函数中自动将其注册到主题,在析构函数中自动从主题移除,避免手动管理带来的遗漏和错误。

4.2.2 代码实现
#include <string>
#include "ISubject.h"class Watcher : public IObserver {
private:std::string m_name;ISubject& m_subject;
public:explicit Watcher(const std::string& name, ISubject& subject) : m_name(name), m_subject(subject) {m_subject.attach(this);}~Watcher() {m_subject.detach(this);}void onNotify() override {std::cout << "Watcher - " << m_name << std::endl;}
};
4.2.3 修改测试代码
#include "ISubject.h"
#include "IObserver.h"
#include "Watcher.h"
#include <iostream>int main() {SomeSubject subject;Watcher watcher1("Watcher-1", subject);Watcher watcher2("Watcher-2", subject);{Watcher watcher3("Watcher-3", subject);} // watcher3 自动从主题移除subject.notifyAll();return 0;
}

4.3 项目文件分离

在实现过程中,可能会遇到“不完整类型”的编译错误。为解决这个问题,我们将项目分离为不同的头文件和实现文件。将 IObserverWatcherISubjectSomeSubject 分别拆分为 .hpp 头文件和 .cpp 实现文件。在 main 函数中包含相应的头文件,确保编译器能够获取完整的类型信息。

4.4 测试改进后的代码

修改后的代码编译时不再报错,运行时也能正常工作。即使 Watcher 3 在新的作用域内创建和销毁,主题在通知时也不会出现运行时错误,因为 Watcher 3 已自动从主题的观察者列表中移除。

5. 总结与展望

5.1 总结

通过本次课程,我们从基础的观察者模式实现逐步优化,添加接口提升了代码的灵活性和可维护性,利用 RAII 技术解决了观察者生命周期问题,提高了代码的安全性。关键在于理解观察者模式的核心概念,掌握接口的使用和 RAII 技术的应用。

5.2 展望

当前代码使用了原始指针,可考虑使用智能指针(如 std::unique_ptr)进一步优化,避免内存泄漏。后续课程将继续为观察者模式添加更多功能,完善该设计模式的实现。希望大家能将这些知识应用到实际项目中,提升代码质量。


文章转载自:

http://tj9gcYMZ.LLxns.cn
http://EcuE1ZjM.LLxns.cn
http://AI1hylWu.LLxns.cn
http://ORVKj6WT.LLxns.cn
http://1cPAIJCc.LLxns.cn
http://ZDkRHb7D.LLxns.cn
http://46I6IR8F.LLxns.cn
http://AaUKyjCZ.LLxns.cn
http://dmMWb0NI.LLxns.cn
http://gIBYRVsU.LLxns.cn
http://PlFJDo8K.LLxns.cn
http://4rDcAOLI.LLxns.cn
http://Bz8uSHd2.LLxns.cn
http://pVCVTBMA.LLxns.cn
http://GaRqySxw.LLxns.cn
http://DUDDOuW9.LLxns.cn
http://FP9yIHSW.LLxns.cn
http://EvI1LsrV.LLxns.cn
http://eXDxGEV5.LLxns.cn
http://9BQHKytX.LLxns.cn
http://WMnV9KM9.LLxns.cn
http://Ad16Mxvp.LLxns.cn
http://TclZj5kz.LLxns.cn
http://450kkc1j.LLxns.cn
http://UNKuJTPF.LLxns.cn
http://fbhYpRA1.LLxns.cn
http://kxmwEbol.LLxns.cn
http://STxeMSPD.LLxns.cn
http://ICVSL3TE.LLxns.cn
http://hVT4dY2S.LLxns.cn
http://www.dtcms.com/wzjs/730527.html

相关文章:

  • o基础学建网站做家电选招标采购哪一个网站好
  • wordpress 下载页插件下载莱芜网站优化费用
  • 做网站用什么编程软件工程建设监理名词解释
  • 类似于微博网站怎么做网站平台建设公司经营范围
  • 太仓网站建设企业网站南京专业网站制作公司有哪些
  • 海淀区网站搭建个人网站备案类型
  • 绍兴市越城区建设局网站网页不能运行wordpress
  • 青海西宁网站开发公司商丘网络推广平台
  • 自己做网站帮公司出认证证书违法吗越秀营销型网站建设
  • 怎么建好网站好的设计logo网站
  • 四川建设厅网站打不开重庆建网站城选快忻科技悉心
  • 襄阳建设路21号创意园网站如何装修网店详细步骤
  • 做蛋糕的网站酒盒包装设计公司
  • 齐齐哈尔做网站的公司怎样在浏览器上找网站
  • 湖南网页设计培训网站建设wordpress插件随机文章
  • 如何用flash做网站网站备案 类型
  • 网站建设晋丰企业网搭建
  • 个人适合网站类型wordpress 配置证书
  • 导航网址网站怎么做seo的作用有哪些
  • 自己用钢管做里闪弹枪视频和照网站原平的旅游网站怎么做的
  • 网站建设需要怎么维护施工企业附属加工厂广联达
  • 大连网络建站模板自己在家搭建服务器
  • 佛山网站建设工作软件推广平台有哪些?哪个比较好
  • 网站域名证书怎么获取洛阳网站制作建设
  • 英文网站建设之后怎么推天津招聘网人才招聘官网
  • 如何在局域网做网站wordpress中控制图片标签
  • 石家庄网站建设汉狮怎么样国外wordpress主机空间
  • 网站动态加速企业网站流量预估
  • 设计师门户网站程序代做网站排名
  • 哪个旅游网站做的比较好蓬莱网站建设公司报价