设计模式的七大原则是软件设计的基石,它们指导开发者构建高内聚、低耦合、易维护、可扩展的系统。以下以C++为例,详细介绍这七大原则:

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

定义:一个类应该只有一个引起它变化的原因(即一个类只负责一项职责)。
目的:降低类的复杂度,提高代码复用性和可维护性。

反例(违反SRP):

一个类同时负责"用户数据管理"和"用户数据展示",当展示方式变化时,可能影响数据管理逻辑。

#include <string>
using namespace std;// 违反SRP:同时负责数据管理和UI展示
class User {
private:string name;
public:User(string n) : name(n) {}// 数据管理职责void save() { /* 保存用户到数据库 */ }// UI展示职责void display() { /* 在控制台打印用户信息 */ }
};
正例(遵循SRP):

拆分职责为两个类,各自负责单一功能:

#include <string>
using namespace std;// 仅负责数据管理
class UserManager {
private:string name;
public:UserManager(string n) : name(n) {}void save() { /* 保存用户到数据库 */ }
};// 仅负责UI展示
class UserDisplay {
private:string name;
public:UserDisplay(string n) : name(n) {}void show() { /* 在控制台打印用户信息 */ }
};

二、开放封闭原则(Open-Closed Principle, OCP)

定义:软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。
目的:在不修改现有代码的前提下,通过扩展实现新功能,减少风险。

反例(违反OCP):

添加新形状时,需要修改现有计算面积的函数:

#include <iostream>
using namespace std;enum ShapeType { CIRCLE, RECTANGLE };class Shape {
public:ShapeType type;// 违反OCP:添加新形状需修改此函数double calculateArea() {if (type == CIRCLE) {// 圆形面积计算} else if (type == RECTANGLE) {// 矩形面积计算}return 0;}
};
正例(遵循OCP):

通过抽象基类和继承扩展新功能,无需修改原有代码:

#include <iostream>
using namespace std;// 抽象基类(对修改关闭)
class Shape {
public:virtual double calculateArea() = 0; // 纯虚函数
};// 圆形(扩展开放)
class Circle : public Shape {
private:double radius;
public:Circle(double r) : radius(r) {}double calculateArea() override {return 3.14 * radius * radius;}
};// 新增矩形无需修改原有代码(扩展开放)
class Rectangle : public Shape {
private:double width, height;
public:Rectangle(double w, double h) : width(

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

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

相关文章

云计算之中间件与数据库

一、云数据库的特性云数据库是指被优化或部署到一个虚拟计算环境中的数据库&#xff0c;可以实现按需付费、按需扩展、高可用性以及存储整合等优势。根据数据库类型一般分为关系型数据库和非关系型数据库&#xff08;NoSQL数据库&#xff09; 。云数据库的特性序号云数据库的特…

codeforces(1045)(div2) E. Power Boxes

E.电源箱 每次测试时限&#xff1a; 2 秒 每次测试的内存限制&#xff1a;256 兆字节 输入&#xff1a;标准输入 输出&#xff1a;标准输出 这是一个互动问题。 给你 nnn 个方格&#xff0c;索引从 111 到 nnn 。这些方格看起来完全相同&#xff0c;但是每个方格都有一个隐藏的…

4G模块 EC200通过MQTT协议连接到阿里云

命令说明 基础AT指令ATI显示MT的ID信息ATCIMI查询IMSIATQCCID查询ICCIDATCSQ查询信号强度ATCGATT?查询当前PS域状态MQTT配置指令ATQMTCFG配置MQTT可选参数ATQMTCFG配置MQTT可选参数.ATQMTOPEN打开MQTT客户端网络ATQMTCLOSE关闭MQTT客户端网络ATQMTCONN连接客户端到MQTT服务器…

如何选择合适的安全监测预警系统

在当今高度复杂和互联的数字化时代&#xff0c;安全威胁无处不在且持续演变。一套高效、可靠的安全监测预警系统已成为组织保障其物理资产、数字信息和关键业务连续性的核心基础设施。然而&#xff0c;面对市场上琳琅满目的产品和解决方案&#xff0c;如何做出符合自身需求的选…

ELK-使用logstash-output-zabbix插件实现日志通过zabbix告警

ELK-使用logstash-output-zabbix插件实现日志通过zabbix告警logstash-output-zabbix插件安装编辑logstash配置文件在zabbix上创建模板实现的效果:elk收集上来的日志中含有报错时(例如error等)&#xff0c;logstash过滤出来将这部分日志打到zabbix&#xff0c;再通过zabbix结合钉…

【C++游记】物种多样——谓之多态

枫の个人主页 你不能改变过去&#xff0c;但你可以改变未来 算法/C/数据结构/C Hello&#xff0c;这里是小枫。C语言与数据结构和算法初阶两个板块都更新完毕&#xff0c;我们继续来学习C的内容呀。C是接近底层有比较经典的语言&#xff0c;因此学习起来注定枯燥无味&#xf…

Visual Scope (Serial_Digital_Scope V2) “串口 + 虚拟示波器” 工具使用记录

VisualScope 就是一个 “串口 + 虚拟示波器” 的工具,适合在没有昂贵示波器/逻辑分析仪时做嵌入式调试。它的核心步骤就是 MCU 定时发数据 → PC 串口接收 → 软件画波形。 首先准备串口通信工具后,插入电脑,安装完USB转串口驱动后,在“我的电脑”-“设备及管理器”-“端口…

c++ 观察者模式 订阅发布架构

#include <iostream> #include <vector> #include <algorithm> #include <memory> #include <mutex>// 观察者接口 class IObserver { public:virtual ~IObserver() default;virtual void update(const std::string& message) 0; };// 主题…

oracle 表空间扩容(增加新的数据文件)

SELECT tablespace_name,file_name,ROUND(bytes / 1024 / 1024, 2) AS size_mb,ROUND(maxbytes / 1024 / 1024, 2) AS max_size_mb,status,autoextensible FROM dba_data_files ORDER BY tablespace_name;--给表空间增加一个新数据库文件ALTER TABLESPACE EAS_D_EAS_STANDARDAD…

DAY 58 经典时序预测模型2

知识点回顾&#xff1a; 时序建模的流程时序任务经典单变量数据集ARIMA&#xff08;p&#xff0c;d&#xff0c;q&#xff09;模型实战SARIMA摘要图的理解处理不平稳的2种差分 n阶差分---处理趋势季节性差分---处理季节性 昨天我们掌握了AR, MA, 和 ARMA 模型&#xff0c;它们…

【人工智能】AI代理重塑游戏世界:动态NPC带来的革命性沉浸式体验

还在为高昂的AI开发成本发愁?这本书教你如何在个人电脑上引爆DeepSeek的澎湃算力! 在当今游戏行业迅猛发展的时代,AI代理技术正悄然引发一场革命,尤其是动态非玩家角色(NPC)的应用,将传统静态游戏体验提升至全新的沉浸式境界。本文深入探讨AI代理在游戏中的核心作用,从…

服务器关机故障排查:大白话版笔记

注意:本文解释文字仅供学习交流使用,不构成专业的技术指导或建议;只是理论实例解释不代表实际运维场景操作,注意鉴别! 运维日常最头疼的就是服务器 “突然躺平” —— 要么没操作就自己关机,要么想关还关不掉。 紧急检查清单 (Cheat Sheet) 服务器突然宕机,重启后第一…

如何通过docker进行本地部署?

如何通过docker进行本地部署&#xff1f; 在做项目的过程中&#xff0c;想要上线项目的话肯定是不能在我们电脑上进行开发的&#xff0c;要部署到服务器上面&#xff0c;今天就总结一下操作步骤。 1、创建springboot项目 随便创建一个springboot工程&#xff0c;确保control…

解锁AI“黑匣”:监督、无监督与强化学习探秘

在当今数字化浪潮汹涌澎湃的时代&#xff0c;AI 决策已然成为推动各领域变革与发展的核心驱动力&#xff0c;从智能语音助手到自动驾驶汽车&#xff0c;从医疗诊断辅助到金融风险预测&#xff0c;AI 决策的身影无处不在&#xff0c;深刻地改变着人们的生活与工作方式。​AI 决策…

F008 vue+flask 音乐推荐评论和可视化系统+带爬虫前后端分离系统

文章结尾部分有CSDN官方提供的学长 联系方式名片 文章结尾部分有CSDN官方提供的学长 联系方式名片 关注B站&#xff0c;有好处&#xff01; F008 &#x1f3b6;vueflask 音乐推荐和可视化系统带爬虫前后端分离系统 编号&#xff1a;F008 B站视频介绍&#xff1a; vueflask-云音…

海盗王64位dx9客户端修改篇之二

目前全网&#xff0c;估计也就只有这个是海盗王客户端3.0的原始版直接升级成64位dx9的了。客户端非常简洁&#xff0c;连64位lua都集成进去&#xff0c;除了新更换的64位SDL音乐播放库dll没办法集成外&#xff0c;没有任何多余的其他文件了。 之前有其他大佬将1.38的改成了dx9的…

点评项目(Redis中间件)第二部分Redis基础

Redis的java客户端spring整合了前三种我们只需要学习spring整合的就行了。不过还是有企业使用老一套的原生的jedis。jedis操作引入依赖<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.7.0</ve…

LeetCode-19day:贪心算法

贪心算法经典题目总结&#xff08;C实现&#xff09; 贪心算法是一种在每一步选择中都采取当前状态下最优&#xff08;即最有利&#xff09;的选择&#xff0c;从而希望导致结果是全局最优的算法。本文总结了四道经典的贪心算法问题&#xff0c;帮助你更好地理解和掌握贪心算法…

Microsoft Edge WebView2 Runtime:为应用程序提供浏览器核心功能

在现代软件开发中&#xff0c;嵌入网页内容到应用程序界面是一个常见的需求。Microsoft Edge WebView2 Runtime&#xff08;WebView2运行库&#xff09;作为微软操作系统WebView2控件的运行环境&#xff0c;基于Chromium内核构建&#xff0c;为应用程序提供了浏览器核心功能&am…

PDF文件中的相邻页面合并成一页,例如将第1页和第2页合并,第3页和第4页合并

PDF页面合并工具 这个工具可以将PDF文件中的相邻页面合并成一页&#xff0c;例如将第1页和第2页合并&#xff0c;第3页和第4页合并&#xff0c;以此类推。 功能 自动检测PDF文件中的页面数量将相邻的页面合并成一页处理奇数页数的PDF文件&#xff08;最后一页单独保留&#xff…