侯捷 C++ 课程学习笔记:设计模式在面向对象开发中的应用

在侯捷老师的《C++ 面向对象开发》课程中,除了对面向对象编程的基础特性(封装、继承和多态)的深入讲解外,还引入了设计模式这一高级主题。设计模式是面向对象编程中的一种最佳实践,能够帮助开发者解决常见的设计问题,提升代码的可维护性和可扩展性。侯捷老师通过丰富的实战案例,让我对设计模式在 C++ 开发中的应用有了更深刻的理解。以下是我对这部分内容的学习笔记和心得体会。

在这里插入图片描述

一、课程核心内容:设计模式在 C++ 面向对象开发中的应用

侯捷老师在课程中详细讲解了几种常用的设计模式,包括单例模式(Singleton)、工厂模式(Factory)、观察者模式(Observer)和策略模式(Strategy)。这些设计模式不仅解决了实际开发中的常见问题,还通过面向对象的思想提升了代码的可扩展性和可维护性。

(一)单例模式(Singleton)

单例模式是设计模式中最简单的一种,它确保一个类只有一个实例,并提供一个全局访问点。侯捷老师通过以下代码展示了单例模式的实现:

#include <iostream>class Singleton {
private:static Singleton* instance;Singleton() {} // 私有构造函数public:static Singleton* getInstance() {if (instance == nullptr) {instance = new Singleton();}return instance;}void showMessage() const {std::cout << "Hello from Singleton!" << std::endl;}
};// 初始化静态成员变量
Singleton* Singleton::instance = nullptr;int main() {Singleton* s1 = Singleton::getInstance();Singleton* s2 = Singleton::getInstance();s1->showMessage();s2->showMessage();// 检查是否为同一个实例std::cout << "Same instance: " << (s1 == s2 ? "Yes" : "No") << std::endl;return 0;
}

侯捷老师指出,单例模式在需要全局访问某个资源时非常有用,例如日志记录器、配置管理器等。但需要注意的是,单例模式可能会引入全局状态,从而增加代码的耦合性。

(二)工厂模式(Factory)

工厂模式用于创建对象,而无需指定具体的类。侯捷老师通过一个简单的图形类库展示了工厂模式的使用:

#include <iostream>
#include <memory>
#include <string>// 基类
class Shape {
public:virtual void draw() const = 0;virtual ~Shape() = default;
};// 具体类
class Circle : public Shape {
public:void draw() const override {std::cout << "Drawing a Circle" << std::endl;}
};class Rectangle : public Shape {
public:void draw() const override {std::cout << "Drawing a Rectangle" << std::endl;}
};// 工厂类
class ShapeFactory {
public:std::unique_ptr<Shape> getShape(const std::string& shapeType) {if (shapeType == "CIRCLE") {return std::make_unique<Circle>();} else if (shapeType == "RECTANGLE") {return std::make_unique<Rectangle>();}return nullptr;}
};int main() {ShapeFactory shapeFactory;auto shape1 = shapeFactory.getShape("CIRCLE");shape1->draw();auto shape2 = shapeFactory.getShape("RECTANGLE");shape2->draw();return 0;
}

侯捷老师强调,工厂模式通过将对象的创建逻辑封装在工厂类中,使得代码更加灵活和可扩展。当需要添加新的类时,只需扩展工厂类即可,无需修改客户端代码。

(三)观察者模式(Observer)

观察者模式用于实现对象之间的依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都会自动更新。侯捷老师通过一个简单的消息通知系统展示了观察者模式的实现:

#include <iostream>
#include <vector>
#include <string>// 抽象观察者
class Observer {
public:virtual void update(const std::string& message) = 0;virtual ~Observer() = default;
};// 抽象主题
class Subject {
private:std::vector<Observer*> observers;public:void attach(Observer* observer) {observers.push_back(observer);}void detach(Observer* observer) {observers.erase(std::remove(observers.begin(), observers.end(), observer), observers.end());}void notify(const std::string& message) {for (auto observer : observers) {observer->update(message);}}
};// 具体观察者
class ConcreteObserver : public Observer {
public:void update(const std::string& message) override {std::cout << "Observer received message: " << message << std::endl;}
};int main() {Subject subject;ConcreteObserver observer1, observer2;subject.attach(&observer1);subject.attach(&observer2);subject.notify("Hello Observers!");subject.detach(&observer1);subject.notify("Observer1 detached.");return 0;
}

侯捷老师指出,观察者模式非常适合实现事件驱动的系统,例如 GUI 应用程序中的事件监听机制。通过观察者模式,可以实现低耦合的设计,使得系统的扩展更加灵活。

(四)策略模式(Strategy)

策略模式用于定义一系列算法,并将它们封装在独立的类中。侯捷老师通过一个简单的排序算法示例展示了策略模式的使用:

#include <iostream>
#include <vector>
#include <algorithm>// 抽象策略
class SortStrategy {
public:virtual void sort(std::vector<int>& data) const = 0;virtual ~SortStrategy() = default;
};// 具体策略:冒泡排序
class BubbleSort : public SortStrategy {
public:void sort(std::vector<int>& data) const override {for (size_t i = 0; i < data.size(); ++i) {for (size_t j = 0; j < data.size() - i - 1; ++j) {if (data[j] > data[j + 1]) {std::swap(data[j], data[j + 1]);}}}}
};// 具体策略:快速排序
class QuickSort : public SortStrategy {
public:void sort(std::vector<int>& data) const override {std::sort(data.begin(), data.end());}
};// 上下文类
class Sorter {
private:SortStrategy* strategy;public:Sorter(SortStrategy* strategy) : strategy(strategy) {}void setStrategy(SortStrategy* strategy) {this->strategy = strategy;}void sort(std::vector<int>& data) {strategy->sort(data);}
};int main() {std::vector<int> data = {5, 2, 9, 1, 5, 6};Sorter sorter(new BubbleSort());sorter.sort(data);std::cout << "Sorted data (Bubble Sort): ";for (int num : data) {std::cout << num << " ";}std::cout << std::endl;sorter.setStrategy(new QuickSort());sorter.sort(data);std::cout << "Sorted data (Quick Sort): ";for (int num : data) {std::cout << num << " ";}std::cout << std::endl;return 0;
}

侯捷老师强调,策略模式通过将算法封装在独立的类中,使得算法可以独立于客户端代码进行扩展和修改。这种方式不仅提高了代码的可维护性,还使得算法的切换更加灵活。

二、学习心得:设计模式在实际开发中的价值

通过学习侯捷老师的《C++ 面向对象开发》课程,我对设计模式有了更深刻的理解。侯捷老师不仅讲解了设计模式的理论知识,还通过大量实战案例展示了如何在实际开发中应用这些模式。

(一)设计模式的灵活性

设计模式提供了一种灵活的解决方案,能够帮助开发者解决常见的设计问题。例如,工厂模式通过封装对象的创建逻辑,使得代码更加灵活和可扩展;观察者模式通过解耦对象之间的依赖关系,使得系统的扩展更加灵活。

(二)提升代码的可维护性

设计模式通过面向对象的思想,将复杂的逻辑封装在独立的类中,使得代码更加清晰和易于维护。例如,策略模式通过将算法封装在独立的类中,使得算法的修改和扩展不会影响客户端代码。

(三)面向对象设计原则的应用

侯捷老师在课程中还介绍了面向对象设计的一些基本原则,如单一职责原则、开闭原则、里氏替换原则等。这些原则为设计模式的应用提供了指导,帮助开发者设计出更合理、更灵活的系统。

三、实际应用案例:设计模式在项目中的实战应用

在学习侯捷老师的课程后,我将所学知识应用到了实际项目中。我们团队负责开发一个简单的任务调度系统,需要管理任务的创建、执行和通知机制。通过侯捷老师对设计模式的讲解,我决定使用工厂模式和观察者模式来实现这一功能。

(一)项目背景

任务调度系统需要管理任务的创建、执行和通知机制。每个任务可以被分配到不同的执行器上,并且需要在任务状态发生变化时通知相关观察者。系统需要支持灵活的任务扩展和通知机制。

(二)工厂模式的应用

我们使用工厂模式来创建任务对象。任务对象的类型可以根据任务的类型动态决定。以下是代码示例:

#include <iostream>
#include <memory>
#include <string>// 基类
class Task {
public:virtual void execute() const = 0;virtual ~Task() = default;
};// 具体任务
class EmailTask : public Task {
public:void execute() const override {std::cout << "Sending email..." << std::endl;}
};class FileTask : public Task {
public:void execute() const override {std::cout << "Processing file..." << std::endl;}
};// 工厂类
class TaskFactory {
public:std::unique_ptr<Task> createTask(const std::string& taskType) {if (taskType == "EMAIL") {return std::make_unique<EmailTask>();} else if (taskType == "FILE") {return std::make_unique<FileTask>();}return nullptr;}
};int main() {TaskFactory taskFactory;auto task1 = taskFactory.createTask("EMAIL");task1->execute();auto task2 = taskFactory.createTask("FILE");task2->execute();return 0;
}

通过工厂模式,我们能够灵活地创建不同类型的任务对象,而无需在客户端代码中直接实例化具体类。

(三)观察者模式的应用

我们使用观察者模式来实现任务状态变化的通知机制。任务对象作为主题,观察者可以注册到任务对象上,并在任务状态变化时接收通知。以下是代码示例:

#include <iostream>
#include <vector>
#include <string>// 抽象观察者
class Observer {
public:virtual void update(const std::string& message) = 0;virtual ~Observer() = default;
};// 抽象主题
class Subject {
private:std::vector<Observer*> observers;public:void attach(Observer* observer) {observers.push_back(observer);}void detach(Observer* observer) {observers.erase(std::remove(observers.begin(), observers.end(), observer), observers.end());}void notify(const std::string& message) {for (auto observer : observers) {observer->update(message);}}
};// 具体主题:任务
class Task : public Subject {
private:std::string status;public:void setStatus(const std::string& newStatus) {status = newStatus;notify("Task status changed to: " + status);}
};// 具体观察者
class TaskObserver : public Observer {
public:void update(const std::string& message) override {std::cout << "Observer received message: " << message << std::endl;}
};int main() {Task task;TaskObserver observer1, observer2;task.attach(&observer1);task.attach(&observer2);task.setStatus("RUNNING");task.setStatus("COMPLETED");task.detach(&observer1);task.setStatus("FAILED");return 0;
}

通过观察者模式,我们能够灵活地实现任务状态变化的通知机制,而无需在任务类中直接管理观察者。

四、总结与展望

通过学习侯捷老师的《C++ 面向对象开发》课程,我对设计模式有了更深刻的理解,并将其应用到了实际项目中。侯捷老师清晰的讲解和丰富的实战案例让我受益匪浅。在学习过程中,我深刻体会到了设计模式的灵活性、代码的可维护性以及面向对象设计原则的重要性。
在未来的学习中,我将继续深入学习侯捷老师的其他课程,如《C++ STL 标准库与泛型编程》和《C++ 新标准 11/14》,进一步提升自己的 C++ 编程能力。我相信,在侯捷老师的指导下,我能够在 C++ 的世界中不断进步,成为一名优秀的开发者。
侯捷老师的 C++ 系列课程不仅让我掌握了丰富的知识,还让我学会了如何将这些知识应用到实际项目中。感谢侯捷老师的辛勤付出,让我在 C++ 的学习道路上找到了方向。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/20657.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前七章综合练习

一&#xff0c;拓扑图 二&#xff0c;实验要求 不限 三&#xff0c;实验步骤 第一步&#xff0c;搭建拓扑图 如上 注意&#xff1a; 第二步&#xff0c;配置IP trust&#xff1a; client1 client2 fw untrusrt-1&#xff1a; fw r3 电信DNS 百度web-1 untrust-2&#xf…

个人shell脚本分享

在周一到周五做增量备份&#xff0c;在周六周日做完全备份 #!/bin/bash定义变量 SRC“/path/to/source” # 源目录 BKUP“/backup” # 备份主目录 FUL“KaTeX parse error: Expected EOF, got # at position 22: …ull" #̲ 完全备份目录 INC"BKUP/inc” # 增量备份…

C语言之函数封装技巧

目录 前言 一、函数在源代码中的三种状态 二、函数封装的运用 案例1&#xff1a;实现打印20以内的素数 案例2&#xff1a;存放因子数并返回长度 三、return返回与形参返回 四、<>与“” 五、解耦 总结 前言 在C语言中&#xff0c;函数封装是一种重要的技巧&#…

深度神经网络终极指南:从数学本质到工业级实现(附Keras版本代码)

深度神经网络终极指南&#xff1a;从数学本质到工业级实现&#xff08;附Keras版本代码&#xff09; 为什么深度学习需要重新理解&#xff1f;&#xff08;与浅层模型的本质差异&#xff09; 模型类型参数容量特征学习方式适合问题类型浅层模型102-104手动特征工程低维结构化数…

vue3 + thinkphp 接入 七牛云 DeepSeek-R1/V3 流式调用和非流式调用

示例 如何获取七牛云 Token API 密钥 https://eastern-squash-d44.notion.site/Token-API-1932c3f43aee80fa8bfafeb25f1163d8 后端 // 七牛云 DeepSeek API 地址private $deepseekUrl https://api.qnaigc.com/v1/chat/completions;private $deepseekKey 秘钥;// 流式调用pub…

IIS asp.net权限不足

检查应用程序池的权限 IIS 应用程序池默认使用一个低权限账户&#xff08;如 IIS_IUSRS&#xff09;&#xff0c;这可能导致无法删除某些文件或目录。可以通过以下方式提升权限&#xff1a; 方法 1&#xff1a;修改应用程序池的标识 打开 IIS 管理器。 在左侧导航树中&#x…

代码解读:如何将HunYuan T2V模型训练成I2V模型?

Diffusion models代码解读:入门与实战 前言:HunYuan T2V模型出来很久了,但是想要训练成I2V的模型还是有点难度。此外,还有很多预训练视频模型都是T2V的,可以借鉴本文的方法加入参考图作为条件,并严格保持视频的第一帧与Image一样。 目录 Patch Image Padding Channel …

windows事件倒计时器与提醒组件

widgets 这是桌面组件前端开源组件&#xff0c;作者称&#xff1a;项目还在持续完善中&#xff0c;目前包含键盘演示、抖音热榜、喝水提醒、生日列表、待办事项、倒计时、灵动通知、打工进度等多个组件 有vue编程能力的可以自己做组件 百度网盘 夸克网盘 桌面组件 | Ca…

汽车零部件工厂如何通过工业一体机实现精准控制

在汽车制造行业中&#xff0c;零部件的精度和质量直接关系到整车的性能与安全。随着汽车工业的快速发展&#xff0c;汽车零部件工厂对生产过程的精准控制提出了更高的要求。传统的生产管理模式往往依赖人工操作和分散的系统&#xff0c;难以满足现代汽车零部件工厂的需求。而工…

BMS保护板测试仪:电池安全与性能的坚实守护者

在新能源汽车、储能系统、电动工具等电池驱动型产品日益普及的今天&#xff0c;电池的安全性和性能成为了人们关注的焦点。而BMS保护板测试仪作为电池管理系统&#xff08;BMS&#xff09;中不可或缺的一部分&#xff0c;为电池的安全运行提供了有力保障。 BMS保护板测试仪的重…

Django的初步使用

1.安装Django pip install django 验证是否安装成功&#xff1a; $ python3 Python 3.8.10 (default, Jan 17 2025, 14:40:23) [GCC 9.4.0] on linux Type "help", "copyright", "credits" or "license" for more information. >…

(前端基础)CSS(一)

了解 Cascading Style Sheet&#xff1a;层叠级联样式表 CSS&#xff1a;表现层&#xff08;美化网页&#xff09;如&#xff1a;字体、颜色、边框、高度、宽度、背景图片、网页定位、网页浮动 css优势&#xff1a; 内容和表现分离网页结构表现统一&#xff0c;可以实现复用…

CASAIM与韩国DOOSAN集团达成合作,开启工业制造自动化检测新篇

近日&#xff0c;CASAIM与韩国知名跨国企业斗山集团&#xff08;DOOSAN&#xff09;达成战略合作&#xff0c;联合打造CASAIM全自动化智能检测系统&#xff0c;助力斗山集团全面提升产品质量检测精度与效率&#xff0c;完成智能化检测升级&#xff0c;保持在全球市场竞争中的领…

矛盾(WEB)

##解题思路 打开靶场就是一段自相矛盾的代码&#xff0c;既要num是数字类型&#xff0c;又要判断为1 这种情况我们会想到弱类型的编程语言&#xff0c;插件查看过后&#xff0c;php就是弱类型的语言&#xff0c;此处并非是严格相等&#xff0c;只是 因此可以根据弱类型编程语言…

[AI]docker封装包含cuda cudnn的paddlepaddle PaddleOCR

封装,启动时需要在GPU服务器上 显卡驱动 cuda等下载需要注册账号 环境Ubuntu 24.04 LTS镜像uvicorn-gunicorn-fastapi:python3.8显卡支持版本CUDA Version: 12.5cuda版本cuda_12.4.0_550.54.14_linux.runcudnn版本PaddlePaddle-GpuPaddleOCR 启动进入容器 docker run --gpus …

idea连接gitee(使用idea远程兼容gitee)

文章目录 先登录你的gitee拿到你的邮箱找到idea的设置选择密码方式登录填写你的邮箱和密码登录成功 先登录你的gitee拿到你的邮箱 具体位置在gitee–>设置–>邮箱管理 找到idea的设置 选择密码方式登录 填写你的邮箱和密码 登录成功

VisionTransformer(ViT)与CNN卷积神经网络的对比

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

Java并发编程面试题:锁(17题)

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

Jeesite5:Star24k,Spring Boot 3.3+Vue3实战开源项目,架构深度拆解!让企业级项目开发效率提升300的秘密武器

嗨&#xff0c;大家好&#xff0c;我是小华同学&#xff0c;关注我们获得“最新、最全、最优质”开源项目和高效工作学习方法 企业级应用开发的需求日益增长。今天&#xff0c;我们要介绍的是一个在GitHub上广受好评的开源项目——Jeesite5。这不仅是一个技术框架&#xff0c;更…

Python OpenCV图像去模糊实战:离焦模糊的修复原理与Python实现

针对因焦距未调好导致的彩色图像模糊问题,结合OpenCV的锐化处理和色彩空间转换技术,推荐以下分步解决方案: 一、YUV色彩空间锐化(保留颜色信息) 原理: YUV色彩空间:YUV色彩空间将图像分为亮度(Y)和色度(U和V)分量。通过仅处理亮度通道(Y),可以有效避免对颜色信…