工作两年后,我如何看待设计模式
在软件工程中,设计模式是经过反复验证的最佳实践,用于解决在软件设计中经常遇到的一类问题。它们为开发者提供了一种通用的解决方案和语言,使得复杂的编程问题得以简化,代码结构更加清晰,可维护性大大提高。简而言之,设计模式在应用程序中可以被统称为"套路"。

这个"套路"即是以高内聚和低耦合为底层思想,并且符合OOD设计原则。所谓OOD设计原则就是:
- 单一职责原则:每个类应该有一个清晰明了的职责,只做与自己主要职责相关的事情,避免加入其它不相关的职责。这有助于降低类的复杂度,提高代码的可读性和可维护性。
- 开放-关闭原则(Open-Closed Principle):软件实体(如类、模块、函数等)应当对扩展开放,对修改关闭。这意味着当需要添加新功能时,应尽量避免修改已有的代码,而是通过扩展的方式来实现。这有助于保持软件的稳定性和可维护性。
- 里氏替换原则(Liskov Substitution Principle):在继承体系中,子类应当能够替换其父类并保持在软件中的行为不变。这要求子类在继承父类时,必须遵循父类的约定,以确保软件行为的正确性。
- 依赖倒置原则:高层模块不应该依赖于低层模块,它们都应该依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象。这一原则有助于减少类之间的耦合度,提高系统的可维护性和可扩展性。
- 接口隔离原则:客户端不应该依赖它不需要的接口,即多个特定的客户端接口要好于一个通用性的总接口。这有助于避免接口的过度臃肿,使接口更加精简和专注。
- 迪米特法则(最少知道原则):一个对象应当对其他对象保持最少的了解,即只与直接的朋友通信。这有助于降低系统的复杂度,减少类之间的耦合度。
这些原则共同构成了OOD的基石,指导开发人员在设计面向对象系统时遵循最佳实践,以创建出更加灵活、可扩展且易于维护的软件系统。
设计模式与编程语言或编程范式有关吗?
但是我们要注意的是,在不同的编程范式(如结构化编程、面向对象编程、函数式编程)对设计模式的应用和实现也会有所不同。例如,在函数式编程中,可能会采用不同于面向对象编程的设计模式来解决问题。
编程语言的特性会影响设计模式的实现方式,但设计模式本身是独立于具体编程语言的。

在面向对象编程中我们通常有二十三种设计模式,它们被分为三大类型:
创建型模式主要处理对象的创建机制,旨在将系统与使用哪个具体类的信息隔离开来,使得系统能够独立于如何创建、组合和表示对象。
结构型模式关注类和对象的组合。继承的概念被用来组合接口和定义组合对象获得新功能的方式。
行为型模式关注对象之间的通信。
那么我们在编程中使用设计模式时主要依赖于哪些思维?
首先,需要具备强大的抽象思维能力。设计模式本身就是一种高度抽象的概念,它们提取了软件开发中的共性问题和解决方案。因此,使用设计模式时需要我们能够从具体的编程问题中抽象出共性的结构和行为,以便正确地选择和应用设计模式。
其次,结构化思维对于理解和应用设计模式至关重要。设计模式通常涉及到多个类和对象之间的交互,这就要求我们能够清晰地理解和描述这些交互关系,以及它们在整体设计中的作用。结构化思维有助于我们将复杂的设计问题分解为更小、更易于管理的部分,并找出各部分之间的关系。
另外,灵活性和可扩展性思维也是应用设计模式时必不可少的。设计模式的目标之一就是提高软件系统的灵活性和可扩展性,使系统能够更容易地适应未来的变化。因此,开发者在应用设计模式时,需要时刻考虑如何在满足当前需求的同时,为未来的变化留下足够的空间。
最后,创新思维对于设计模式的应用也至关重要。虽然设计模式提供了一套通用的解决方案,但在实际应用中,往往需要根据项目的具体需求和约束进行适当的调整和创新。这就要求开发者不仅要熟悉设计模式的基本原理,还要具备足够的创新意识和实践能力,以便将设计模式与项目的实际情况相结合,创造出既符合设计要求又具有创新性的解决方案。
总的来说,设计模式是编程中一种宝贵的工具,它们能够帮助我们解决复杂的问题,提高代码的质量和维护性。但同时,我们也需要谨慎地使用它们,以确保它们能够真正地为我们的项目带来价值。
相关文章:
工作两年后,我如何看待设计模式
在软件工程中,设计模式是经过反复验证的最佳实践,用于解决在软件设计中经常遇到的一类问题。它们为开发者提供了一种通用的解决方案和语言,使得复杂的编程问题得以简化,代码结构更加清晰,可维护性大大提高。简而言之&a…...
01 Web基础与HTTP协议
1、域名和DNS 1.1 域名的概念 如果说一个主机,没有名字也可以完全用IP来代替,但是IP地址不好记忆。例如说,我们记一些网站的名称百度、新浪、搜狐等很好记,但是如果要去记百度的IP、新浪的IP、以及搜狐的IP地址,那将会…...
Java求自然常数e的近似值(课堂实例1)
❤❤引言🎃🎃 ❤点关注编程梦想家(大学生版)-CSDN博客不迷路~~~~~~❤ 自然常数 𝑒e 是数学中一个非常重要的常数,约等于 2.71828,它在自然对数、复合利息计算等领域有着广泛的应用。本文将介绍如…...
简过网:什么是咨询工程师?我不允许还有人不知道!
咨询工程师真的有必要考吗?近期小编收到很多关于咨询工程师的的问题,今天,小编给大家整理汇总了一下关于咨询工程师的相关问题,希望能够帮助到大家! 一、什么是咨询工程师? 咨询工程师是从事工程咨…...
数据泄露时代的安全之道:访问认证的重要性
引言 想象一下:你一觉醒来,收到一条通知——你的公司遭遇了数据泄露。你感到恐惧,因为这意味着客户数据被曝光,公司声誉受损,还有巨额罚款在等着你。在当今的数字化环境中,这种情况太常见了。全球各地的组…...
XLSX + LuckySheet + LuckyExcel + Web Worker实现前端的excel预览
文章目录 功能简介简单代码实现web worker 版本效果参考 功能简介 通过LuckyExcel的transformExcelToLucky方法, 我们可以把一个文件直接转成LuckySheet需要的json字符串, 之后我们就可以用LuckySheet预览excelLuckyExcel只能解析xlsx格式的excel文件&a…...
Java版本迭代的过程(Java面经)
Java 5: 泛型与注解 泛型:使得Web应用可以编写更加类型安全的代码,特别是在处理各种数据结构时,如集合框架的使用。注解:极大地简化了配置管理,Spring框架的崛起得益于Java 5的注解支持,使得依赖注入和AOP…...
深入了解java锁升级可以应对各种疑难问题
对于java锁升级,很多人都停留在比较浅层的表面理解,一定程度下也许够用,但如果学习其中的细节,我们更好地理解多线程并发时各种疑难问题的应对方式! 因此我将锁升级过程中可能涉及的大部分细节或者疑问都整合成了一篇…...
C++初学者指南-4.诊断---基础:警告和测试
C初学者指南-4.诊断—基础知识:警告和测试 文章目录 C初学者指南-4.诊断---基础知识:警告和测试1. 术语和技术记住:使用专用类型! 2.编译器警告Gcc/CLang 编译器选项MS Visual Studio 编译器选项 3.断言运行时断言静态断言&#x…...
docker使用镜像jms_all部署jumpserver
创建容器需要挂载出来的服务器对应目录 mkdir -p /data/redis/data mkdir -p /opt/mysql/{data,conf,logs}docker安装redis docker run -d -it --name redis -p 6379:6379 -v /data/redis/data:/data --restart=always...
在Java项目中集成单元测试与覆盖率工具
在Java项目中集成单元测试与覆盖率工具 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 单元测试是软件开发中至关重要的一环,它用于验证代码在独立…...
CTF实战:从入门到提升
CTF实战:从入门到提升 🚀前言 没有网络安全就没有国家安全,网络安全不仅关系到国家整体信息安全,也关系到民生安全。近年来,随着全国各行各业信息化的发展,网络与信息安全得到了进一步重视,越…...
Spring Boot集成olingo快速入门demo
1.什么是olingo? Apache Olingo 是个 Java 库,用来实现 Open Data Protocol (OData)。 Apache Olingo 包括服务客户端和 OData 服务器方面。 Open Data Protocol (开放数据协议,OData) 是用来查询和更新数据的一种W…...
GPT对话代码库——HAL库下 USART 的配置及问题(STM32G431CBT6)
目录 1,问: 1,答: 示例代码 正确的HAL库初始化方式 自定义初始化方式(不推荐) 总结 2,问: 2,答: 代码详细解释 初始部分 主初始化部分 初始化调用…...
ExoPlayer架构详解与源码分析(14)——ProgressiveMediaPeriod
系列文章目录 ExoPlayer架构详解与源码分析(1)——前言 ExoPlayer架构详解与源码分析(2)——Player ExoPlayer架构详解与源码分析(3)——Timeline ExoPlayer架构详解与源码分析(4)—…...
docker部署kafka(单节点) + Springboot集成kafka
环境: 操作系统:win10 Docker:Docker Desktop 4.21.1 (114176)、Docker Engine v24.0.2 SpringBoot:2.7.15 步骤1:创建网络: docker network create --subnet172.18.0.0/16 net-kafka 步骤2:安…...
一.1.(3)半导体二极管基本电路的分析方法及常见应用电路
1.二极管基本电路的分析方法 先标正负极,再看是否理想二极管 将二极管视为断路,求两端电压 两端电压均大于导通电压,压差大的先导通(由于电源不是完全的阶跃,而是有一个电压爬升的过程) 2.常见应用电路 1.求…...
银河麒麟V10 SP1 审计工具 auditd更新
前言 银河麒麟V10 SP1 审计工具 auditd 引发的内存占用过高, 内存使用率一直在 60% 以上, 内存一直不释放 排查 可以使用ps或者top查看系统进程使用情况 ps -aux|sort -k4nr|head -n 5 发现银河麒麟审计工具 auditd 一直占用内存不释放 解决 办法一…...
JWT(Json Web Token)在.NET Core中的使用
登录成功时生成JWT字符串目录 JWT是什么? JWT的优点: JWT在.NET Core 中的使用 JWT是什么? JWT把登录信息(也称作令牌)保存在客户端为了防止客户端的数据造假,保存在客户端的令牌经过了签名处理…...
《QT从基础到进阶·四十三》QPlugin插件多线程问题和只有插件dll没有头文件和lib文件时调用插件中的方法
1、插件和多线程问题: 创建插件对象不能放到多线程执行,不然报错:ASSERT failure in QWidget: "Widgets must be created in the GUlthread. //不能放在多线程执行 QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName))…...
接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
