设计模式总结(设计模式的原则及分类)

1.什么是设计模式? 

设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。这些模式不仅可以加快开发速度,还可以提高代码的可读性、可维护性和可复用性。

2.你知道哪些设计模式

3.设计模式的原则有哪些

(1)单一职责原则(Single Responsibility Principle,SRP):一个类只负责一个功能领域中的相应职责,或者可以定义为:就一个类而言,应该只有一个引起它变化的原因。

(2)开闭原则(Open-Closed Principle,OCP):一个软件实体应当对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展。

比如我们的程序员分为Java程序员、C#程序员、PHP程序员、前端程序员等,而他们要做的都是去打代码,具体如何打代码是根据不同语言的程序员来决定的,可以将程序员打代码这一个行为抽象成一个统一的接口或是抽象类,这样就满足了开闭原则的第一个要求:对扩展开放,不同的程序员可以自由地决定他们该如何进行编程。而具体哪个程序员使用什么语言怎么编程,是自己在负责,不需要其他程序员干涉,所以满足第二个要求:对修改关闭。

(3)里氏代换原则(Liskov Substitution Principle,LSP):所有引用基类(父类)的地方必须能透明地使用其子类的对象。(即子类可以扩展父类的功能,但不能改变父类原有的功能)

  • 子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。
  • 子类可以增加自己特有的方法。
  • 当子类的方法重载父类的方法时,方法的前置条件(即方法的输入/入参)要比父类方法的输入参数更宽松。
  • 当子类的方法实现父类的方法时(重写/重载或实现抽象方法),方法的后置条件(即方法的输出/返回值)要比父类更严格或与父类一样。

(4)依赖倒转原则(Dependency Inversion Principle,DIP): 高层模块不应该依赖于低层模块,两者都应该依赖于抽象(接口或抽象类);抽象不应该依赖于具体实现,具体实现应该依赖于抽象。

高层模块不依赖于低层模块:传统的设计中,高层模块直接依赖于低层模块,这会导致高层模块的代码与低层模块紧耦合,不利于系统的扩展和维护。依赖倒转原则要求高层模块和低层模块都依赖于抽象,从而实现解耦。

抽象不依赖于具体实现:抽象层(如接口或抽象类)不应该依赖于具体的实现类,而是应该通过依赖注入等方式,将具体的实现注入到抽象层中。

实现依赖倒转原则的方法:

使用接口或抽象类:定义接口或抽象类,通过依赖接口或抽象类来解耦具体实现。

依赖注入:通过构造函数注入、Setter方法注入或接口注入的方式,将具体的实现类注入到依赖抽象的类中。

(5)接口隔离原则(Interface Segregation Principle,ISP):使用多个专门的接口,而不使用单一的总接口,接口应该小而专一,避免臃肿;即客户端不应该依赖那些它不需要的接口。

(6)合成复用原则:优先使用对象组合来实现代码复用,而不是通过继承来实现。这一原则的核心思想是通过将功能分解成更小、更独立的组件,然后将这些组件组合在一起,以实现更复杂的功能。

优点:

  • 灵活性高:对象组合可以在运行时动态地改变对象的行为,而继承只能在编译时决定。
  • 降低耦合度:对象组合使得各个组件之间的耦合度降低,从而提高了系统的可维护性和可扩展性。
  • 增强代码复用:通过组合可以更方便地复用代码,因为一个对象可以包含多个组件,每个组件都可以在不同的上下文中被复用。

实现方法:

  • 接口和实现分离:将功能定义为接口,然后实现这些接口的具体类通过组合这些接口的实现类来实现复杂功能。
  • 策略模式:使用策略模式,通过将算法封装在独立的策略类中,然后在运行时选择和组合不同的策略。
  • 装饰者模式:通过装饰者模式,在不改变对象的基础上,动态地添加功能。

(7)迪米特法则(Law of Demeter,LoD):迪米特法则的核心思想是一个对象应尽可能少地了解其他对象,只与直接的朋友通信,而避免与陌生的对象通信。用于降低系统的耦合度,提高代码的可维护性和可扩展性。

4.设计模式的分类

设计模式通常分为三大类:

  • 创建型模式:在创建对象的同时隐藏创建逻辑,不使用 new 直接实例化对象,程序在判断需要创建哪些对象时更灵活。包括工厂/抽象工厂/单例/建造者/原型模式。
  • 结构型模式:通过类和接口间的继承和引用实现创建复杂结构的对象。包括适配器/桥接模式/过滤器/组合/装饰器/外观/享元/代理模式。
  • 行为型模式: 通过类之间不同通信方式实现不同行为。包括责任链/命名/解释器/迭代器/中介者/备忘录/观察者/状态/策略/模板/访问者模式。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构(4.0)——串的定义和基本操作

串的定义(逻辑结构) 串,即字符串(String)是由零个或多个字符组成的有序数列。 一般记为Sa1a2....an(n>0) 其中,S是串名,单引号括起来的字符序列是串的值;ai可以是字母、数字或其他字符;串中字符的个数n称为串的长度。n0时的…

Proxyman for Mac v5.6.1 抓包调试工具

Mac分享吧 文章目录 效果一、下载软件二、功能三、开始安装1、双击运行软件,将其从左侧拖入右侧文件夹中,等待安装完毕2、应用程序显示软件图标,表示安装成功 四、运行测试1、打开软件 安装完成!!! 效果 一…

SpringBoot介绍以及第一个SpringBoot程序

T04BF 👋专栏: 算法|JAVA|MySQL|C语言 🫵 今天你敲代码了吗 文章目录 2.第一个SpringBoot程序2.1Spring Boot介绍2.2使用idea创建Spring Boot程序2.2.1 社区版idea2.2.2专业版idea2.2.3创建SpringBoot项目2.2.4项目代码和目录介绍目录介绍pom文件 2.3Web…

leetcode 周赛(406)全AC留念

纪念第一次 leetcode 周赛(406)全AC 1.(100352. 交换后字典序最小的字符串) 题目描述: 给你一个仅由数字组成的字符串 s,在最多交换一次 相邻 且具有相同 奇偶性 的数字后,返回可以得到的 字典序最小的字符串 。 如…

量化发展历史简述,QMT/PTrade+恒生UFT、LDP极速柜台适用哪些情形?

量化发展简述 1.2004年萌发阶段:策略局限在量化择时,量化选股等; 光大保德信量化核 心基金 上投摩根阿尔法基 金 金融危机,海归引入。 2.2010量化元年:中低频交易为主,主要依靠套利、对冲、多因子策略等…

Nginx入门到精通一(基本概念介绍)

下面内容整理自bilibili-尚硅谷-Nginx青铜到王者视频教程 Nginx相关文章 Nginx入门到精通二(安装配置)-CSDN博客 Nginx入门到精通三(Nginx实例1:反向代理)-CSDN博客 Nginx入门到精通四(反向代理2&…

linux服务器登录mysql无异常,本地登录报1045 -Access denied for user

1、本地登录linux服务器报“1045 -Access denied for user (用户访问被拒绝)” 造成上面链接问题的原因是,用户权限不足,需要在linux服务器上执行如下2条命令即可 CREATE USER root127.0.0.1 IDENTIFIED BY root123; GRANT ALL P…

蔚来Java实习一面总结

此文用于个人面经总结,答案可能存在出入,望理性食用~~ 1. 分析时间复杂度的工具 2. 数组和链表的区别 数组:线性表,存储空间连续,可以通过下标直接访问元素,查找时间复杂度为O(1),插入的时间…

前端Vue组件化实践:打造自定义等宽tabs标签组件

在前端开发的世界里,随着业务复杂度的提升和需求的多样化,传统的整体式开发方式已经难以满足快速迭代和高效维护的需求。组件化开发作为一种重要的解决方案,正逐渐受到广大开发者的青睐。本文将结合Vue框架,探讨如何通过组件化开发…

Linux 网络配置与连接

一、网络配置 1.1 ifconfig 网卡配置查询 ifconfig #查看所有启动的网络接口信息 ifconfig 指定的网卡 #查看指定网络接口信息 1.2 修改网络配置文件 vim /etc/sysconfig/network-scripts/ifcfg-ens33 #ens33网络配置文…

数据驱动未来,Xinstall全渠道统计方案引领行业变革

在这个信息爆炸的时代,App市场的竞争日益激烈。对于每一个开发者或营销人员来说,掌握准确、全面的数据分析能力,是提升产品竞争力、优化营销策略的关键。然而,面对投放渠道的分散、数据打通的困难以及作弊流量的困扰,许…

CentOS7.X系统部署Zabbix6.0版本(可跟做)

文章目录 一、部署环境说明二、基本环境部署步骤1、环境初始化操作2、部署并配置Nginx3、部署并配置PHP4、测试NginxPHP环境5、部署并配置MariaDB 三、Zabbix-Server部署步骤1、编译安装Zabbix-Server2、导入Zabbix初始化库3、配置Zabbix前端UI4、启动Zabbix-Server5、WEB页面配…

大厂必争之地!AI搜索产品万字长文分析

多年以前,百度、谷歌等就在开始做智能搜索,但彼时的智能搜索只是对搜索结果的简单整理归纳,效果并不如人意。当前AI爆火,在AI的加持下,搜索会不会更强大一些呢?其实并不是,至少当前AI搜索的使用…

【Linux杂货铺】期末总结篇2:文件操作命令 | 目录操作命令

🌈个人主页:聆风吟_ 🔥系列专栏:Linux实践室、网络奇遇记 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 第四章4.1 ⛳️Linux与windows的文件系统差别4.2 ⛳️目录相关的常用术语4.3 ⛳️Linux文件类型…

环境配置|PyCharm——Pycharm本地项目打包上传到Github仓库的操作步骤

一、Pycharm端的设置操作 通过Ctrl+Alt+S快捷组合键的方式,打开设置,导航到版本控制一栏中的Git,在Git可执行文件路径中,输入Git.exe。 按照下图顺序,依次点击,完成测试。输出如图标④的结果,即可完成测试。 输出下图结果,配置Git成功,如本地未安装Git,需自行安装。

机器学习 | 深入理解激活函数

什么是激活函数? 在人工神经网络中,节点的激活函数定义了该节点或神经元对于给定输入或一组输入的输出。然后,将此输出用作下一个节点的输入,依此类推,直到找到原始问题的所需解决方案。 它将结果值映射到所需的范围…

Java的数组

概念:用于存储同一数据类型的多个元素[容器] 声明格式:数据类型[] 变量名; 初始化: 1. 静态初始化 数据类型[] 数组名 new 数据类型[]{元素一,元素二,元素三....}简化格式: 数据类型[] 数组名 {元素一,元素二,元素三....} 简…

phenocycler发现免疫治疗反应关键的肿瘤微环境区域

T 细胞介导的抗原特异性反应对于有效的免疫监视至关重要。然而T细胞如何进入肿瘤微环境并操纵局部组织微环境来实现效应器功能,以及这些局部的细胞结构如何对T细胞疗法或者其他免疫治疗做出反应仍然不清楚。近期来自斯坦福大学的研究者利用小鼠模型和临床患者样本&a…

【LeetCode力扣】006. Z 字形变换(Python)

最快解法 参考了运行时间最短的代码&#xff0c;其使用的思路就是按列排序后连接。 class Solution:def convert(self, s: str, numRows: int) -> str:if numRows < 2 : # numRows1时候&#xff0c;对应输出为原字符串return sn len(s)lst [ for _ in range(numRows…

数据库:redis练习题

1、安装redis&#xff0c;启动客户端、验证。 redis-server redis-cli 2、string类型数据的命令操作&#xff1a; &#xff08;1&#xff09; 设置键值&#xff1a; set mykey "haha" &#xff08;2&#xff09; 读取键值&#xff1a; get mykey &#xff08;3&…