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

这个"套路"即是以高内聚和低耦合为底层思想,并且符合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))…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)
题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...
DAY 26 函数专题1
函数定义与参数知识点回顾:1. 函数的定义2. 变量作用域:局部变量和全局变量3. 函数的参数类型:位置参数、默认参数、不定参数4. 传递参数的手段:关键词参数5 题目1:计算圆的面积 任务: 编写一…...
