设计模式介绍

写在前面的话

以前也学习过设计模式,但是总感觉学不懂,最近开发项目深刻感受到设计模式的重要性,系统学习一些。

我是观看油管上李建忠老师的视频学习做的总结,会不断补充,欢迎大家指出错误,学习进步。

首先设计模式是在软件开发过程中用于解决特定设计问题的经验总结和最佳实践。它们是一种面向对象设计的指导原则,可帮助开发人员更有效地构建可重用、可维护和可扩展的软件系统。

看了李建忠老师的视频,我发现为什么之前学习设计模式感到很吃力,因为之前学习只是为了去看某个模式的代码是怎么写的,用的时候比葫芦画瓢,所以理解的并不深刻,有点像死记硬背。

所以想要学懂设计模式,我们不应该把眼光单单放在看懂某一模式的代码,而是从更底层的方面去了解,为什么要有设计模式、这个设计模式基于什么情况使用、软件开发过程中设计模式解决了什么问题。带着这些问题去研究设计模式才能更好的举一反三。

设计模式其实是一种面向对象设计的指导原则,“好的面向对象设计模式”指的是那些可以满足“应对变化,提高复用”的设计。

软件设计的要点是“寻找变化点,在变化点处应用设计模式”

“什么时候,什么地方应用设计模式比理解设计模式结构本身更为重要。”

设计模式分类

从目的来看:

  • 创建型模式
  • 结构型模式
  • 行为型模式

从范围来看:

  • 类模式处理类与子类的静态关系
  • 对象模式处理对象间的动态关系

遵循的原则

单一职责原则:一个类应该只有一个引起它变化的原因。一个类应该只包含一个责任,这样可以提高类的内聚性和可维护性。

开放封闭原则:软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。通过抽象和多态,可以使系统在不修改代码的情况下进行扩展。

里氏替换原则:任何父类可以被子类替换,而程序的行为不会受到影响。子类应该能够替代其父类在所有使用父类的地方,这样可以确保系统的稳定性和扩展性。

接口隔离原则:客户端不应该依赖于它不需要使用的接口。将大的接口拆分为更小、更具体的接口,可以减少耦合性,并提高系统的可维护性和灵活性。

依赖倒置原则:应该依赖于抽象而不是具体实现。高层模块不应该依赖低层模块,二者都应该依赖于抽象。通过使用接口和依赖注入等技术,可以降低组件之间的耦合性。

迪米特法则:一个对象应该对其他对象有最少的了解。一个对象应该与其它对象之间保持松耦合,只与最紧密的的朋友发生交互。减少对象之间的依赖关系可以提高系统的可维护性和灵活性。

其实这些原则更准确来说是面向对象的设计原则,项目开发过程中通过应用设计模式来到达满足这些原则,使得代码的可读性、可扩展性大大提高。

目前关于设计模式的介绍只总结到这些,后续会继续补充,尽量用最少的语言表达最清楚。

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

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

相关文章

k8s ----对外暴露

目录 一、Ingress 简介 1、Ingress 组成 2、Ingress 工作原理 二、部署Ingress 1、部署 nginx-ingress-controller 2、暴露ingress 4.1 DaemonSetHostNetworknodeSelector模式的service 4.2 DeploymentNodePort模式的Service 三、Ingress HTTP 代理访问 四、Ingress …

数据结构与算法【递归】Java实现

递归 递归是一种解决计算问题的方法,其中解决方案取决于同一类问题的更小子集。 特点: 自己调用自己,如果说每个函数对应着一种解决方案,自己调用自己意味着解决方案是一样的(有规律的)每次调用&#xf…

计算机毕业设计选题推荐-体育赛事微信小程序/安卓APP-项目实战

✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

图像分类:对google/vit-large-patch32-384模型进行微调

背景: 图像分类是很常见的场景,比如日常的物体识别,可很多时候我们还需要根据自己的数据来训练自己的分类,大模型出现以后,我们不需要再重头来训练我们的模型,直接根据已经训练好的大模型进行微调即可&…

Oracle(2-1) Networking Overview

文章目录 一、基础知识1、Network Environ Challenges 网络环境挑战2、Simple Network :2-Tier 简单的两层网络3、Simple to Complex : N-Tier 简单到复杂:N层网络4、Oracle Network Solutions Oracle网络解决方案5、Key Features of Oracle Net Oracle Net的主要功…

JavaWeb篇_09——Tomcat运行过程以及Servlet继承结构

Tomcat运行过程 用户访问localhost:8888/test/helloword.do,请求被发送到Tomcat,被监听8888端口并处理 HTTP/1.1 协议的Connector获得。Connector把该请求交给它所在的Service的Engine来处理,并等待Engine的回应。Engine获得请求localhost/t…

酷柚易汛ERP-购货订单操作指南

1、应用场景 先下购货订单,收货入库后生成购货单。 2、主要操作 2.1 新增购货订单 打开【购货】-【购货订单】新增购货订单。(*为必填项,其他为选填) ① 录入供应商:点击供应商字段框的 ,在弹框中选择供…

买房和租房哪个划算?

目录 1、考虑因素 1. 1费用比较 1.2 资产增值 1.3 税收影响 1.4 灵活性 1.5 贷款利率 1.6 长期计划 1.7 当地市场条件 2、买房计算 2.1等额本息 2.2等额本金 3、租房计算 1、考虑因素 在比较买房和租房哪个更划算时,需要考虑多个因素。以下是一些可以考…

客户下单时如何自动匹配到最近的门店

有些商家有多个门店,当客户下单时,希望能够将客户下的订单分配给最近的门店。下面就具体介绍一下在采云小程中是如何实现的。 首先,为了简便起见,请确定门店高级设置保持着默认设定。因为单独的商品管理模式以及独享的商品信息模…

【milkv】0、duo编译环境搭建

一、开发资料整理 Docker https://hub.docker.com/repository/docker/dreamcmi/cv1800-docker/general GitHub https://github.com/milkv-duo/duo-buildroot-sdk CV181x/CV180x MMF SDK 开发文档汇总 https://developer.sophgo.com/thread/471.html cv181x芯片使用的交叉…

CCF 备忘

一、不错的网站 CCF CCSP 竞赛历年资料 官网 http://118.190.20.162/home.page 二、基础套路 循环输入 数组标记法&#xff08;数组下标-数值 的映射&#xff09; 两个矩阵相乘 map<long long, map<long long, long long> > ans; for(int i1;i<d;i){for(int…

长按事件怎么加定时器

要实现长按事件并加入定时器&#xff0c;你可以结合使用mousedown和mouseup事件&#xff0c;然后在mousedown时启动定时器&#xff0c;在mouseup时停止定时器。以下是一个使用Vue.js的例子&#xff1a; <template><div><p>长按计时器示例: {{ timerValue }}…

【Linux】 ls -l 和 grep

语法:用于显示指定工作目录下之内容 ls [-alrtAFR] [name...]将 /bin 目录以下所有目录及文件详细资料列出: ls -lR /bin将 /usr/local/bin 目录以下所有有关python列出: ls -l /usr/local/bin/ | grep python在使用 ls -l 命令时&#xff0c;第一列的字符表示文件或目录的类…

js 加密解密 cryptojs(对称加密库)

js 加密解密可以使用 crypto-js 这是一个对称加密的库&#xff0c; 可以使用 AES DES 但没有 rsa 等非对称加密的方法 安装方法 npm install crypto-js 它可以进行 MD5 SHA-1 SHA-256 Base64 AES DES 等算法和加密 import crypto from "crypto-js"let md5binary cry…

RT-Thread系列10——ETH网口设备

文章目录 1. ETH测试第一步&#xff1a;cubemx配置。第二步&#xff1a;board.h配置。第三步&#xff1a;rtthread settings配置第四步&#xff1a;以太网复位引脚设置第五步&#xff1a;修改rtthread源码第六步&#xff1a;修改 cubemx 生成的 main 函数第七步&#xff1a;编译…

C++阶段复习‘‘‘‘总结?【4w字。。。】

文章目录 前言类和对象C类定义和对象定义类成员函数C 类访问修饰符公有&#xff08;public&#xff09;成员私有&#xff08;private&#xff09;成员受保护&#xff08;protected&#xff09;成员 继承中的特点类的构造函数和析构函数 友元函数内联函数this指针指向类的指针类…

缩点+图论路径网络流:1114T4

http://cplusoj.com/d/senior/p/SS231114D 重新梳理一下题目 我们先建图 x → y x\to y x→y&#xff0c;然后对点分类&#xff1a;原串出现点&#xff0c;原串未出现点。 假如我们对一个原串出现点进行了操作&#xff0c;那么它剩余所有出边我们立刻去操作必然没有影响。所…

快速入门安装及使用git与svn的区别常用命令

一、导言 1、什么是svn&#xff1f; SVN是Subversion的简称&#xff0c;是一个集中式版本控制系统。与Git不同&#xff0c;SVN没有分布式的特性。在SVN中&#xff0c;项目的代码仓库位于服务器上&#xff0c;团队成员通过向服务器提交和获取代码来实现版本控制。SVN记录了每个…

数据库实验二

--①查询信息管理系学生的学号和姓名。 --select sno,sname from Student where sdept IS --②查询选修了课程的学生的学号。 --select distinct sc.sno from sc,student --③查询选修了课程号为C001的学生的学号和成绩&#xff0c;并对查询结果按成绩降序排列&#xff0c;如…

专题知识点-二叉树-(非常有意义的一篇文章)

这里写目录标题 二叉树的基础知识知识点一(二叉树性质 )树与二叉树的相互转换二叉树的遍历层次优先遍历树的深度和广度优先遍历中序线索二叉树二叉树相关遍历代码顺序存储和链式存储二叉树的遍历二叉树的相关例题左右两边表达式求值求树的深度找数找第k个数二叉树非递归遍历代码…