六大设计原则:构建优雅、可维护和可扩展的软件

news2025/1/18 6:51:11

六大设计原则:构建优雅、可维护和可扩展的软件

  • 单一职责原则 (Single Responsibility Principle)
  • 开放封闭原则 (Open-Closed Principle)
  • 里氏替换原则 (Liskov Substitution Principle)
  • 依赖倒置原则 (Dependency Inversion Principle)
  • 接口隔离原则 (Interface Segregation Principle)
  • 合成复用原则 (Composite Reuse Principle)

设计原则是在软件工程中用于指导和评估设计决策的基本准则。遵循这些原则有助于创建具有高内聚性、低耦合性和易于维护的软件系统。在本文中,我们将介绍六大常用的设计原则,分别是单一职责原则、开放封闭原则、里氏替换原则、依赖倒置原则、接口隔离原则和合成复用原则,并通过例子详细说明它们的应用和好处。

单一职责原则 (Single Responsibility Principle)

定义: 单一职责原则要求一个类应该只有一个引起变化的原因。换句话说,一个类应该只有一个职责。

应用场景: 单一职责原则有助于确保类的高内聚性,降低了修改一个类的复杂性。适用于将复杂类分解为更小、更易管理的部分。

示例: 一个日志类可以负责记录日志,但不应该负责处理配置。

class Logger {
    public void log(String message) {
        // 记录日志到文件
    }
}

class ConfigurationManager {
    public void loadConfig() {
        // 加载配置
    }

    public void saveConfig() {
        // 保存配置
    }
}

开放封闭原则 (Open-Closed Principle)

定义: 开放封闭原则要求软件实体(类、模块、函数等)应该对扩展开放,但对修改封闭。也就是说,应该通过扩展现有代码来引入新功能,而不是修改现有代码。

应用场景: 开放封闭原则鼓励使用抽象、接口和多态来实现可扩展性,减少对现有代码的修改。适用于需求经常变化的系统。

示例: 使用抽象工厂模式来创建可扩展的图形用户界面。

interface Button {
    void click();
}

class WindowsButton implements Button {
    public void click() {
        System.out.println("Windows button clicked.");
    }
}

class MacButton implements Button {
    public void click() {
        System.out.println("Mac button clicked.");
    }
}

里氏替换原则 (Liskov Substitution Principle)

定义: 里氏替换原则要求子类能够替代其基类,而不会影响程序的正确性。也就是说,子类应该继承基类的行为,但可以扩展或修改该行为。

应用场景: 里氏替换原则有助于确保代码的一致性,可以通过继承和多态来实现。适用于创建抽象基类和具体子类。

示例: 使用里氏替换原则创建不同形状的图形。

class Shape {
    public void draw() {
        // 绘制图形
    }
}

class Circle extends Shape {
    public void draw() {
        // 绘制圆形
    }
}

class Rectangle extends Shape {
    public void draw() {
        // 绘制矩形
    }
}

依赖倒置原则 (Dependency Inversion Principle)

定义: 依赖倒置原则要求高层模块不应该依赖于低层模块,二者都应该依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象。

应用场景: 依赖倒置原则通过面向接口编程来实现松耦合,减少了模块之间的直接依赖。适用于使用接口、抽象类和依赖注入来实现。

示例: 使用依赖倒置原则创建通知系统,让发送者和接收者都依赖于通知接口。

interface Notification {
    void sendNotification(String message);
}

class EmailNotification implements Notification {
    public void sendNotification(String message) {
        // 发送电子邮件通知
    }
}

class SMSNotification implements Notification {
    public void sendNotification(String message) {
        // 发送短信通知
    }
}

接口隔离原则 (Interface Segregation Principle)

定义: 接口隔离原则要求客户端不应该强制依赖它们不使用的接口。一个类不应该强制实现它不需要的接口。

应用场景: 接口隔离原则有助于避免庞大的接口,提高代码的可维护性和可读性

。适用于将大接口分解为多个小接口。

示例: 拆分大接口 Worker 为多个小接口,如 WorkerEaterSleeper

interface Worker {
    void work();
    void eat();
    void sleep();
}

class Employee implements Worker {
    public void work() {
        // 员工工作
    }

    public void eat() {
        // 员工吃饭
    }

    public void sleep() {
        // 员工睡觉
    }
}

class Robot implements Worker {
    public void work() {
        // 机器人工作
    }

    public void eat() {
        // 机器人不需要吃饭
    }

    public void sleep() {
        // 机器人不需要睡觉
    }
}

合成复用原则 (Composite Reuse Principle)

定义: 合成复用原则要求通过组合或聚合已有的类来实现新功能,而不是通过继承已有的类。

应用场景: 合成复用原则有助于减少继承的复杂性和耦合度,通过组合现有类来构建新功能。适用于创建可重用的模块。

示例: 使用合成复用原则创建一个通用的日志记录器,它可以记录到文件、数据库或控制台。

interface Logger {
    void log(String message);
}

class FileLogger implements Logger {
    public void log(String message) {
        // 记录日志到文件
    }
}

class DatabaseLogger implements Logger {
    public void log(String message) {
        // 记录日志到数据库
    }
}

class ConsoleLogger implements Logger {
    public void log(String message) {
        // 记录日志到控制台
    }
}

这六大设计原则是构建高质量、可维护和可扩展软件的关键指导原则。通过理解和遵循这些原则,开发人员可以更轻松地创建健壮的软件系统。当这些原则结合在一起时,它们提供了一个强大的设计框架,有助于解决复杂的编程问题。

版权声明:
原创博主:牛哄哄的柯南
博主原文链接:https://keafmd.blog.csdn.net/
个人博客链接:https://www.keafmd.top/

看完如果对你有帮助,感谢点击下面的点赞支持!
[哈哈][抱拳]

在这里插入图片描述
加油!

共同努力!

Keafmd

感谢支持牛哄哄的柯南,期待你的三连+关注~~

keep accumulate for my dream【共勉】

                                                       ↓   ↓   ↓   ↓   ↓   ↓  

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

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

相关文章

【Linux】Shell命令行的简易实现(C语言实现)内键命令,普通命令

文章目录 0.准备工作1.大体框架 一、获取命令行二、解析命令行三、进程执行1.普通命令2.内建命令 四、完整代码&#xff1a; 0.准备工作 1.大体框架 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> #include <u…

【MySql】MySql表的增删查改

目录 1.新增 1.1单行数据 全列插入 2.2 多行数据 指定列插入 2.查询 2.1 全列查询 2.2 指定列查询 2.3查询字段为表达式 2.4 别名 2.5 去重&#xff1a;DISTINCT 2.6 排序&#xff1a;ORDER BY 2.7 条件查询&#xff1a;WHERE 2.8 分页查询&#xff1a;LIMIT 3.修…

ARMday01(计算机理论、ARM理论)

计算机理论 计算机组成 输入设备、输出设备、运算器、控制器、存储器 1.输入设备&#xff1a;将编写好的软件代码以及相关的数据输送到计算机中&#xff0c;转换成计算机能够识别、处理和存储的数据形式 键盘、鼠标、手柄、扫描仪、 2.输出设备&#xff1a;将计算机处理好的数…

警告:未配置spring boot 配置注解处理器

前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 问题 我再使用ConfigurationProperties(prefix “redisson”)去加载配置文件中的属性的时候&#xff0c;发现idea有个警告 并且配…

系统提示缺少或找不到msvcp140.dll文件的解决方法

MSVCP140.dll是Microsoft Visual C 2015 Redistributable的一个组件&#xff0c;它是运行许多Windows应用程序所必需的。当您在计算机上遇到“msvcp140.dll丢失”的错误消息时&#xff0c;这意味着您的系统缺少这个重要的动态链接库文件。以下是详细介绍的5种解决方法&#xff…

Halcon WPF 开发学习笔记(1):Hello World小程序

文章目录 文章专栏视频链接Hello World训练图片训练目的 开始训练图像预处理导入图像三通道处理调用算子通道选取 滤波什么是好的滤波 增加对比度 区域选取阈值处理算子参数选择运行结果(红色为选择区域) 区域分割运行结果 特征筛选参数代码第二次&#xff0c;面积筛选 画选中十…

网络工程师回顾学习

根据书本目录&#xff0c;写下需要记忆的地方&#xff1a; 参考之前的笔记&#xff1a; 网络工程师回答问题_one day321的博客-CSDN博客 重构第一部分需要记忆的&#xff1a; 第一章&#xff1a;计算机网络概论 计算机网络的定义和分类&#xff1a;计算机网络是指将地理位…

快速安装虚拟机centos7.5

vbox 快速导入安装centos7.5 环境准备 vbox安装&#xff08;下载地址&#xff09; ova镜像&#xff08;下载地址&#xff09;&#xff08;默认是192.168.56.10 加nat网卡&#xff09; 链接&#xff1a;https://pan.baidu.com/s/164Iprh_80HCQmKCU6V-RTw 提取码&#xff1a;if…

Oauth授权流程

我们经常会使用第三方的账号来登录某个平台&#xff0c;比如使用QQ账号登录爱奇艺&#xff0c;使用微博登录自如APP。而登录的过程中&#xff0c;会提示自如想访问你的微博公开资料、好友信息&#xff0c;或者爱奇艺要访问您QQ头像、照片等资料。那么这个过程是有一个比较复杂的…

【String类的常用方法】

文章目录 字符串构造String对象的比较字符串查找charAtindexof 转化1. 数值和字符串转化2.大小写转换 toUpperCase toLowerCase3.字符串转数组 toCharArray4.数组转字符串5.格式化 format 字符串替换替换所有的指定内容替换首个内容 字符串拆分以空格拆分特殊字符拆分多个分隔符…

【数据分享】1985-2022年我国地级市专利数据(8项指标/Excel格式/Shp格式)

专利数量是反映一个城市创新水平的重要指标&#xff0c;我们在很多研究中都会用到专利数量数据&#xff0c;之前我们也分享过一些相关数据&#xff0c;比如全国地级市2017-2019年发明专利授权数和全国地级市2017-2020年专利授权数&#xff08;均可查看之前的文章获悉详情&#…

在Linux系统下部署Llama2(MetaAI)大模型教程

Llama2是Meta最新开源的语言大模型&#xff0c;训练数据集2万亿token&#xff0c;上下文长度是由Llama的2048扩展到4096&#xff0c;可以理解和生成更长的文本&#xff0c;包括7B、13B和70B三个模型&#xff0c;在各种基准集的测试上表现突出&#xff0c;最重要的是&#xff0c…

FHEW 和 TFHE 的统一框架:标准化 FHE

参考文献&#xff1a; [GHS12] Gentry C, Halevi S, Smart N P. Better bootstrapping in fully homomorphic encryption[C]//International Workshop on Public Key Cryptography. Berlin, Heidelberg: Springer Berlin Heidelberg, 2012: 1-16.[GHPS12] Gentry C, Halevi S,…

视频编辑SDK测试

短视频编辑SDK测试有一段时间了&#xff0c;因此抽时间对编辑SDK的相关内容进行简要复盘。 功能说明 短视频编辑SDK支持gif&#xff0c;不同格式的图片&#xff0c;视频文件的拼接导入&#xff0c;编辑&#xff0c;添加特效&#xff0c;合成导出等功能。更具体的介绍可以参照…

14:00面试,14:06就出来了,问的问题有点变态。。。。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到5月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…

Android 13.0 Launcher3 app图标长按去掉应用信息按钮

1.前言 在13.0的rom定制化开发中,在Launcher3定制化开发中,对Launcher3的定制化功能中,在Launcher3的app列表页会在长按时,弹出微件和应用信息两个按钮,点击对应的按钮跳转到相关的功能页面, 现在由于产品需求要求禁用应用信息,不让进入到应用信息页面所以要去掉应用信息…

5个高质量图片处理软件,抠图、特效不求人!

作为一个设计师或摄影家或者平面设计工作人员&#xff0c;又或者是普通人&#xff0c;只要你有图片处理的需求&#xff0c;就不可避免的会需要一个好用高效的图片处理网站&#xff0c;会抠素材&#xff0c;找图片&#xff0c;删除图片内容等等&#xff0c;都需要花费大量的时间…

【Redis】hash类型-内部编码使用场景

文章目录 内部编码测试内部编码&#xff1a; 使用场景缓存方式对比 内部编码 哈希的内部编码有两种&#xff1a; ziplist&#xff08;压缩列表&#xff09;&#xff1a;当哈希类型元素个数⼩于hash-max-ziplist-entries配置&#xff08;默认512个&#xff09;、同时所有值都⼩…

【C++】智能指针【内存泄漏|智能指针原理及使用|RAII】

目录 1、了解内存泄露 1.1 内存泄漏的定义及危害 1.2 内存泄漏分类&#xff08;了解&#xff09; 1.3 如何检测内存泄漏&#xff08;了解&#xff09; 1.4如何避免内存泄漏 2、智能指针的引出 3、智能指针的使用及原理 3.1 RAII 3.2 智能指针的原理 3.3 std::auto_pt…

雨洪水资源管理远程监控平台

雨洪水资源管理远程监控平台 汛期来临时&#xff0c;及时获得河道水库的水位涨幅数据对开展防汛抗洪工作至关重要&#xff0c;大量河道水库分布在远离城市的区域&#xff0c;而且分散&#xff0c;尤其是在紧急防汛阶段&#xff0c;如果只依靠传统人力巡查获得河道水位数据必将耗…