以光盘读写系统演示面向对象设计的原则与方法

面向对象设计(OOD)是软件开发中的核心方法,强调通过对象、类、继承、封装和多态等概念来构建系统。以下是面向对象设计的原则、方法及常用技术手段:

一、面向对象设计原则(SOLID原则)

  1. 单一职责原则(SRP, Single Responsibility Principle)

    • 一个类应只有一个职责,即只负责一项功能。

    • 优点:提高类的内聚性,降低耦合性,便于维护和扩展。

  2. 开放-封闭原则(OCP, Open-Closed Principle)

    • 软件实体(类、模块、函数等)应对扩展开放,对修改封闭。

    • 优点:通过扩展而非修改现有代码来增加新功能,减少对已有代码的影响。

  3. 里氏替换原则(LSP, Liskov Substitution Principle)

    • 子类应能够替换其父类,且不影响程序的正确性。

    • 优点:确保继承关系的合理性,增强系统的健壮性。

  4. 接口隔离原则(ISP, Interface Segregation Principle)

    • 客户端不应依赖它不需要的接口,接口应尽量细化。

    • 优点:减少接口的冗余,避免实现类承担不必要的职责。

  5. 依赖倒置原则(DIP, Dependency Inversion Principle)

    • 高层模块不应依赖低层模块,二者都应依赖抽象;抽象不应依赖细节,细节应依赖抽象。

    • 优点:降低模块间的耦合性,提高系统的灵活性和可维护性。

二、面向对象设计方法

  1. 抽象(Abstraction)

    • 通过抽象类或接口定义对象的共同特征和行为,隐藏具体实现细节。

    • 优点:简化复杂系统,聚焦核心功能。

  2. 封装(Encapsulation)

    • 将数据和行为封装在类中,通过访问控制(如private、protected、public)隐藏内部细节。

    • 优点:提高代码的安全性和可维护性。

  3. 继承(Inheritance)

    • 通过继承机制,子类可以复用父类的属性和方法,并可以扩展或重写父类的行为。

    • 优点:提高代码的复用性,支持多态。

  4. 多态(Polymorphism)

    • 同一操作作用于不同对象时,可以有不同的解释和执行结果。

    • 优点:增强系统的灵活性和扩展性。

  5. 组合优于继承(Composition over Inheritance)

    • 优先使用组合(对象之间的包含关系)而非继承来实现代码复用。

    • 优点:降低类之间的耦合性,提高系统的灵活性。

三、常用的技术手段

  1. 设计模式(Design Patterns)

    • 创建型模式:如工厂模式、单例模式、建造者模式等,用于对象的创建。

    • 结构型模式:如适配器模式、装饰器模式、代理模式等,用于处理类或对象的组合。

    • 行为型模式:如策略模式、观察者模式、命令模式等,用于对象之间的交互和职责分配。

  2. UML(Unified Modeling Language)

    • 使用UML图(如类图、序列图、状态图等)进行系统设计和建模,帮助开发人员可视化系统结构和行为。

  3. 依赖注入(Dependency Injection, DI)

    • 通过外部容器或框架将依赖对象注入到类中,减少类之间的直接依赖。

    • 优点:降低耦合性,提高代码的可测试性和可维护性。

  4. 接口与抽象类

    • 使用接口定义行为契约,抽象类提供部分实现,帮助实现代码的灵活性和扩展性。

  5. 反射(Reflection)

    • 在运行时动态获取类的信息并操作对象,常用于框架和库的设计中。

    • 优点:增强系统的灵活性和动态性。

  6. 单元测试与Mock对象

    • 通过单元测试验证类的行为,使用Mock对象模拟依赖,确保代码的正确性和可靠性。

四、总结

面向对象设计的核心在于通过抽象、封装、继承和多态等机制,构建灵活、可维护和可扩展的系统。遵循SOLID原则,合理使用设计模式和技术手段,能够有效提高代码质量和开发效率。

下面是一个使用C++实现的简单光盘读写系统的设计示例。这个系统基于面向对象的思想,使用了类、继承、封装和多态等特性。

系统设计

  1. 光盘类(CD):表示光盘的基本信息,如容量、剩余空间等。

  2. 可读写接口(IWritable):定义光盘的读写操作。

  3. 光盘驱动器类(CDDrive):负责光盘的读写操作。

  4. 文件类(File):表示要写入光盘的文件。

代码实现

#include <iostream>
#include <string>
#include <vector>// 文件类
class File {
private:std::string name;int size; // 文件大小,单位为MBpublic:File(const std::string& name, int size) : name(name), size(size) {}std::string getName() const {return name;}int getSize() const {return size;}
};// 可读写接口
class IWritable {
public:virtual bool write(const File& file) = 0;virtual bool read(const std::string& fileName) = 0;virtual ~IWritable() = default;
};// 光盘类
class CD : public IWritable {
private:int capacity; // 光盘容量,单位为MBint usedSpace; // 已用空间,单位为MBstd::vector<File> files; // 存储的文件列表public:CD(int capacity) : capacity(capacity), usedSpace(0) {}int getRemainingSpace() const {return capacity - usedSpace;}bool write(const File& file) override {if (file.getSize() <= getRemainingSpace()) {files.push_back(file);usedSpace += file.getSize();std::cout << "文件 " << file.getName() << " 已写入光盘,大小: " << file.getSize() << "MB" << std::endl;return true;} else {std::cout << "光盘空间不足,无法写入文件 " << file.getName() << std::endl;return false;}}bool read(const std::string& fileName) override {for (const auto& file : files) {if (file.getName() == fileName) {std::cout << "正在读取文件: " << fileName << ",大小: " << file.getSize() << "MB" << std::endl;return true;}}std::cout << "文件 " << fileName << " 未找到" << std::endl;return false;}
};// 光盘驱动器类
class CDDrive {
private:CD* cd; // 当前插入的光盘public:CDDrive() : cd(nullptr) {}void insertCD(CD* newCD) {cd = newCD;std::cout << "光盘已插入" << std::endl;}void ejectCD() {cd = nullptr;std::cout << "光盘已弹出" << std::endl;}void writeFile(const File& file) {if (cd) {cd->write(file);} else {std::cout << "未插入光盘,无法写入文件" << std::endl;}}void readFile(const std::string& fileName) {if (cd) {cd->read(fileName);} else {std::cout << "未插入光盘,无法读取文件" << std::endl;}}
};// 主函数
int main() {// 创建光盘和驱动器CD cd(700); // 700MB容量的光盘CDDrive drive;// 插入光盘drive.insertCD(&cd);// 创建文件File file1("document.txt", 100);File file2("photo.jpg", 300);File file3("video.mp4", 400);// 写入文件drive.writeFile(file1);drive.writeFile(file2);drive.writeFile(file3); // 这个文件将无法写入,因为空间不足// 读取文件drive.readFile("document.txt");drive.readFile("video.mp4"); // 这个文件未写入,读取失败// 弹出光盘drive.ejectCD();return 0;
}

代码说明

  1. File类:表示文件,包含文件名和文件大小。

  2. IWritable接口:定义了光盘的读写操作。

  3. CD类:实现了IWritable接口,表示光盘,包含容量、已用空间和文件列表。

  4. CDDrive类:表示光盘驱动器,负责光盘的插入、弹出以及文件的读写操作。

运行结果

光盘已插入
文件 document.txt 已写入光盘,大小: 100MB
文件 photo.jpg 已写入光盘,大小: 300MB
光盘空间不足,无法写入文件 video.mp4
正在读取文件: document.txt,大小: 100MB
文件 video.mp4 未找到
光盘已弹出

总结

这个设计展示了如何使用面向对象的思想来构建一个简单的光盘读写系统。通过封装、继承和多态等特性,代码具有良好的扩展性和可维护性。可以根据需要进一步扩展系统功能,例如支持多种类型的光盘、增加错误处理机制等。

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

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

相关文章

齿轮热处理学习笔记分享

对于一个做冷加工的人来说&#xff0c;热处理是一个神秘的话题&#xff0c;但是一点都不去了解的话&#xff0c;工作也无法进行。所以抽点时间来学习一下齿轮热处理相关的内容&#xff0c;做成笔记分享给爱学习的小伙伴们&#xff0c;文章较长&#xff0c;需要一些耐心去阅读&a…

WPF 布局舍入(WPF 边框模糊 或 像素错位 的问题)

1. 什么是 WPF 布局舍入&#xff1f; 在 WPF 开发过程中&#xff0c;可能会遇到界面模糊、边框错位、文本渲染不清晰等问题。这些现象通常是由于 WPF 采用 设备无关像素&#xff08;DIP, Device Independent Pixels&#xff09;&#xff0c;在不同 DPI 设置下&#xff0c;UI 元…

Linux中vscode编程,小白入门喂饭级教程

确保Ubuntu联网 因为后面安装VScode需要从互联网下载。 安装GCC 在桌面空白处右键->打开终端 执行命令&#xff1a;gcc -v 在最后一行可以看到gcc version 7.5.0 如果提示Command ‘gcc’ not found&#xff0c;就查一下如何安装gcc&#xff0c;先把gcc安装好。 安装VS…

Python 的 ​ORM(Object-Relational Mapping)工具浅讲

SQLAlchemy相关讲解 1. SQLAlchemy 是什么? ​定义:一个 Python 的 ​ORM(Object-Relational Mapping)工具,允许开发者通过 Python 类与对象操作数据库,而非直接编写 SQL。​核心组件: ​Core:底层 SQL 表达式语言,提供数据库无关的 SQL 操作接口。​ORM:基于 Core …

蓝桥杯真题——洛谷Day13 找规律(修建灌木)、字符串(乘法表)、队列(球票)

目录 找规律 P8781 [蓝桥杯 2022 省 B] 修剪灌木 字符串 P8723 [蓝桥杯 2020 省 AB3] 乘法表 队列 P8641 [蓝桥杯 2016 国 C] 赢球票 找规律 P8781 [蓝桥杯 2022 省 B] 修剪灌木 思路&#xff1a;对某个特定的点来说有向前和向后的情况&#xff0c;即有向前再返回到该位置…

matrix-breakout-2-morpheus 靶机----练习攻略 【仅获取shell】

【此练习仅做到反弹shell】 1.靶机下载地址 https://download.vulnhub.com/matrix-breakout/matrix-breakout-2-morpheus.ova 2. 打开靶机&#xff0c;kali使用nmap扫描同C段的主机 找到靶机ip 确保靶机和kali网卡均为NAT模式 先查看kali的ip nmap 192.168.182.1/24 …

Flutter中Align的使用说明

又失业了&#xff0c;作为一个高龄Android程序员今年找工作真难呀。现在Flutter是必需技能了&#xff0c;所以最近在自学。所用书籍叫《Flutter实战》&#xff0c;如下 如今已看了100多页&#xff0c;发现这本书写得……有点赶吧&#xff0c;好几处讲得不清不楚&#xff0c;而关…

java八股文之常见的集合

一、数组的索引为什么从0开始&#xff1f; 寻址公式&#xff1a; 数组的首地址索引乘以存储数据的类型大小 在根据数组索引获取元素的时候&#xff0c;会用索引和寻址公式来计算内存所对应的元素数据。如果数组的索引从1开始&#xff0c;寻址公式中&#xff0c;就需要增加一次…

用ASCII字符转化图片

代码 from PIL import Image# 定义 ASCII 字符集&#xff0c;从最暗到最亮 ASCII_CHARS "%#*-:. "def resize_image(image, new_width100):width, height image.sizeratio height / widthnew_height int(new_width * ratio)resized_image image.resize((new_wi…

详解Sympy:符号计算利器

Sympy是一个专注于符号数学计算的数学工具&#xff0c;使得用户可以轻松地进行复杂的符号运算&#xff0c;如求解方程、求导数、积分、级数展开、矩阵运算等。其中比较流行的深度学习框架pytorch的用到了Sympy,主要用于将模型的计算图转换为符号化表达式&#xff0c;以便进行分…

高频SQL 50 题(持续更新)

SQL的编写与运用 0. 写在前面 最近学习了数据库系统概论&#xff0c;其中涉及到了关于SQL语句的编写&#xff0c;感觉理论知识不足以让我掌握相关的编写方式&#xff0c;因此选择刷力扣上的题目进行复习巩固。 时间不是很多&#xff0c;可能不会经常更新&#xff0c;有时间写…

【Python】12、函数-02

文章目录 1. 返回值2.文档字符串3. 作用域4. 命名空间 1. 返回值 返回值就是函数执行以后返回的结果&#xff0c;可以通过return来指定函数的返回值。返回值可以通过变量接收返回值 return 后可以返回任意的对象&#xff0c;甚至是一个函数如果仅写一个return或者不写return&…

Unity插件-适用于画面传输的FMETP STREAM使用方法(三)基础使用

目录 一、插件介绍 二、组件介绍 三、Game View Streaming 1、使用 FM Network UDP 的基本设置 Server Scene Client Scene 2、使用使用 FM WebSocket 的基本设置 四、Audio Streaming 五、Microphone Streaming 一、插件介绍 ​​​​​​Unity插件-适用于画面传输的…

如何为预训练模型进行领域适配:全参数微调、LoRA 还是 Prompt Tuning?

目录 如何为预训练模型进行领域适配&#xff1a;全参数微调、LoRA 还是 Prompt Tuning&#xff1f; 1. 全参数微调&#xff08;Full Fine-tuning&#xff09; 适用场景 优缺点 示例代码&#xff08;使用 Hugging Face Transformers 进行全参数微调&#xff09; 2. LoRA&am…

C++ —— 线程同步(互斥锁)

C —— 线程同步&#xff08;互斥锁&#xff09; 线程同步互斥锁&#xff08;互斥量&#xff09;测试代码mutex互斥锁 线程同步 线程同步&#xff1a;多线程协同工作&#xff0c;协商如何使用共享资源。 C11线程同步包含三部分内容&#xff1a; 互斥锁&#xff08;互斥量&…

UI设计中的加载动画:优化用户体验的细节

hello宝子们...我们是艾斯视觉擅长ui设计和前端数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 在数字产品泛滥的今天&#xff0c;用户对体验的要求早已超越功能本身。一个看似简单的加载动画&…

SpringBoot3+Vue3实战(Vue3快速开发登录注册页面并对接后端接口)(4)

目录 一、SpringBoot3Vue3实现基本增删改查。前后端通信交互、配置后端跨域请求。数据批量删除。(博客链接) 二、SpringBoot3Vue3快速开发登录、注册页面并实现对接。 &#xff08;1&#xff09;操作数据表employee(员工信息表)。 <1>修改employee表的字段组成。 <2&g…

Python标准库中bisect模块的bisect_right()函数在网格交易中的应用

本文将深入探讨Python标准库中bisect模块的bisect_right()函数在网格交易中的具体应用。 bisect模块 bisect模块是Python标准库中的一个模块&#xff0c;提供了对有序列表的插入和搜索操作的支持。它基于二分查找算法&#xff0c;可以高效地在有序列表中查找或插入元素&#x…

Excel(函数篇):IF函数、FREQUNCY函数、截取函数、文本处理函数、日期函数、常用函数详解

目录 IF函数等于判断区间判断与AND函数、OR函数一同使用IFNA函数和IFERROR函数 FREQUNCY函数、分断统计LEFT、RIGHT、MID截取函数FIND函数、LEN函数SUBSTITUTE函数ASC函数、WIDECHAR函数实战&#xff1a;如何获取到表中所有工作簿名称文本处理函数TEXT函数TEXTJOIN函数 日期函数…

生成PDF文件:从html2canvas和jsPdf渲染到Puppeteer矢量图

刚刚实现而已&#xff1a;第一次明白&#xff0c;双击或file:///打开html文件&#xff0c;居然和从localhost:3000打开同一个html文件有本质的区别。 字体居然还能以Base64代码嵌入到网页&#xff0c;只是太大太笨。 需要安装node.js&#xff0c;npm安装更多依赖&#xff1a;…