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

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

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

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

相关文章

SpringBoot中动态注册Bean的方式

测试环境,本文源码 Java:8SpringBoot:2.5.14示例场景:动态注册ProxyServlet,间接实现类似于Nginx的反向代理功能 先理解如何实现动态注册 Bean 。 由于在 SpringBoot 中,先进行 Bean 的定义,…

企业全历史行为数据助ToB企业决策层开启营销的上帝视角

“上帝视角”是每个企业家都渴望拥有的。上帝视角的能力有多么吸引人呢?通常,一个企业家在技术、产品、营销中的任何一个领域拥有上帝视角的能力,就足可以让他的企业大杀四方,甚至创造历史。 在技术或产品领域,靠“上…

沙袋装袋机的原理和特点_鼎跃安全

在现代工业和建筑领域,沙子等散状物料的包装是一个必不可少的环节。传统的手工包装方式效率低下且劳动强度大,而沙袋装袋机的出现则极大地提高了包装效率和质量。 一、沙袋装袋机的工作原理 沙子通过输送系统从储料仓输送到装袋机的料斗中。输送系统设计…

Eureka——Spring Cloud中的服务注册与发现组件

目录 1. 前言2. Eureka的概述2.1 Eureka的核心功能2.2 Eureka的角色与特点2.3 Eureka的使用优势 3. 创建 Spring Cloud 的注册中心3.1 创建一个父项目3.2 创建Spring Cloud的注册中心Eureka 4. 创建服务提供者5. 创建一个消费者Consumer,调用服务提供者Provider 1. …

java链表常见简单面试算法题

头插法、尾插法 头插法:先待插入指向头结点的next,后头结点的next指向待插入。 尾插法:借助尾指针,直接插入 /*** 头插法* param head* return*/public static Node head_insert(Node head, int t){Node nodenew Node(t);node.set…

【Diffusion学习】【生成式AI】Stable Diffusion、DALL-E、Imagen 背後共同的套路

文章目录 图片生成Framework 需要3个组件:相关论文【Stable Diffusion,DALL-E,Imagen】 具体介绍三个组件1. Text encoder介绍【结论:文字的encoder重要,Diffusion的模型不是很重要!】评估指标:…

Webpack看这篇就够了

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

补充.IDEA的使用

首先我们要了解在idea中Java工程由项目(project)、模块(module)包(package)、类(class)组成。 他们之间的关系是project包含module包含package包含class。 所以我们要按照先建一个pr…

AutoMQ 社区双周精选第十二期(2024.06.29~2024.07.12)

本期概要 欢迎来到 AutoMQ 第十一期双周精选!在过去两周里,主干动态方面,AutoMQ 跟进了 Apache Kafka 3.4.x BUG 修复,并进行了CPU & GC 性能优化,另外,AutoBalancing 的 Reporter 和 Retriever 也将支…

Linux的相关命令

Linux 1. 什么是Linux系统 Linux,全称GNU/Linux,是一种免费使用和自由传播的类UNIX操作系统,其内核由林纳斯本纳第克特托瓦兹(Linus Benedict Torvalds)于1991年10月5日首次发布,它主要受到Minix和Unix思想…

浏览器缓存:强缓存与协商缓存实现原理有哪些?

1、强缓存:设置缓存时间的,那么在这个时间内浏览器向服务器发送请求更新数据,但是服务器会让其从缓存中获取数据。 可参考:彻底弄懂强缓存与协商缓存 - 简书 2、协商缓存每次都会向浏览器询问,那么是怎么询问的呢&…

H2数据库启动时,设置非“全零监听”

全零监听 全零监听(即将监听地址设置为全零地址,如IPv4中的0.0.0.0或IPv6中的::)在网络服务配置中确实存在一定的安全风险。以下是全零监听可能带来的安全风险: 1. 暴露服务到不安全网络 全网段监听:将监听地址设置…

中介者模式(行为型)

目录 一、前言 二、中介者模式 三、总结 一、前言 中介者模式(Mediator Pattern)是一种行为型设计模式,又成为调停者模式,用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地互相引用,从而使其耦合…

JavaScript基础(十三)

Math对象 方法+说明 ceil() 对数进行上舍入 例:Math.ceil(12.5)返回13; Math.ceil(-12.5)返回-12 (简单点来记就是ceil返回的值要比传入的大) var…

CP Process2

CP Process2 信贷流程,概念,分类,五级十二类

docker镜像命令容器命令

docker镜像命令 1、docker images //查看所有本地的主机上的镜像 2、docker search mysql //搜素镜像 2、docker pull mysql:5.7 //指定版本拉取mysql镜像 3、docker pull mysql //不指定版本拉取mysql镜像 4、docker rmi -f 镜像id //删除指定镜像 5、4、docker rmi -f 镜像…

基于高德地图实现Android定位功能实现(二)

基于高德地图实现Android定位功能实现(二) 在实现的高德地图的基本显示后,我们需要不断完善地图的功能 地图界面设计(悬浮按钮等) 首先就是地图页面的布局,这个根据大家的实际需求进行设计即可&#xff…

前后端数据交互设计到的跨域问题

前后端分离项目的跨域问题及解决办法 一、跨域简述 1、问题描述 这里前端vue项目的端口号为9000,后端springboot项目的端口号为8080 2、什么是跨域 当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域 当前页面url被请求页面url是否…

cuda缓存示意图

一、定义 cuda 缓存示意图gpu 架构示意图gpu 内存访问示意图 二、实现 cuda 缓存示意图 DRAM: 通常指的是GPU的显存,位于GPU芯片外部,通过某种接口(如PCIE)与GPU芯片相连。它是GPU访问的主要数据存储区域,用于存储大…

使用dnscat2 进行dns隧道反弹shell——直连模式linux对windows

直连模式:客户端直接向指定IP地址的DNS服务器发起DNS解析请求 环境搭建 搭建服务端 git clone https://github.com/iagox86/dnscat2.git cd dnscat2/server/ gem install bundler apt-get install ruby-dev bundle install 过程会有点慢 开启服务端 ruby ./dn…