设计模式基础-概括

news2024/12/29 7:46:39

目录

一、设计原则

二、设计模式分类

1、创建型模式:创建对象

2、结构型模式:更大的结构

3、行为型模式:交互以及职责分配

4、对象模式与类模式区别

三、各类型模式简介

1、创建型模式 

2、结构型模式

3、行为型模式


一、设计原则

  • 单一职责:设计目的单一的类。
  • 开放-封闭原则:对扩展开放,对修改封闭。
  • 李氏(Liskow)替换原则:子类可以替换父类。
  • 依赖倒置原则:依赖于抽象,而不是具体实现;针对接口编程。不要针对实现编程。
  • 接口隔离原则:使用多个专门的接口比使用单一的总接口要好。
  • 组合重用原则:要尽量使用组合,而不是继承关系达到重用目的。
  • 迪米特(Demeter)原则(最少知识原则):一个对象应当对其他对象有尽可能的了解

二、设计模式分类

下面我们基于GOF 23种设计模式进行归纳和总结。

1、创建型模式:创建对象

工厂方法模式(Factory Method)、抽象工厂模式(Abstract Factory)、

单利模式(Singleton)、原型模式(Prototype)、建造者模式(Builder)

2、结构型模式:更大的结构

代理模式(Proxy)、门面模式(Facade)、装饰器模式(Decorator)、享元模式(Flyweight)、组合模式(Composite)、适配器模式(Adapter)、桥接模式(Bridge)

3、行为型模式:交互以及职责分配

模板方法模式(Template Method)、策略模式(Strategy)、责任链模式(Chain of Responsibility)、迭代器模式(Iterator)、命令模式(Command)、状态模式(State)、备忘录模式(Memento)、中介者模式(Mediator)、解释器模式(Interpreter)、观察者模式(Observer)、访问者模式(Visitor)

注意:其中工厂方法模式、解释器模式、模板方法模式属于纯类模式

适配器模式属于:对象模式又是类模式。

除此之外都是对象模式

4、对象模式与类模式区别

三、各类型模式简介

1、创建型模式 

  1. 工厂方法模式(Factory Method):定义了创建对象的接口,他允许子类决定定实例化哪个类。简单理解:动态产生对象。
  2. 抽象工厂模式(Abstract Factory):提供一个接口。可以创建一系列相关或者相互依赖的对象,而无需指定他们具体的类。简单理解:生产成系列的对象。
  3. 单利模式(Singleton):确保一个类只有一个实例,并且提供了对该类的全局访问入口。简单理解:单实例。
  4. 原型模式(Prototype):允许对象在不了解要创建对象的确切类以及如何创建等细节的情况下创建自定义对象。通过拷贝原型对象来创建新的对象。简单理解:克隆对象。
  5. 建造者模式(Builder):将一个复杂类的表示与其构造相分离,使得相同的构建过程能够得出不同的表示。简单理解:复杂对象构造。

2、结构型模式

  1. 代理模式(Proxy):为控制对初始对象的访问提供了一个代理或者占位符对象。简单理解:快捷方式。
  2. 门面模式(Facade):子系统中的一组接口提供一个统一的接口。简单理解:对外统一接口。
  3. 装饰器模式(Decorator):在不修改对象对外观和功能的情况下添加或者删除对象功能,即动态地给一个对象添加一些额外的职责。简单理解:动态附加职责。
  4. 享元模式(Flyweight):可以通过共享对象减少系统中低等的,详细的对象数目提供支持大量细粒度对象共享的有效方法。简单理解:汉子编码。
  5. 组合模式(Composite):创建树型层次结构来改变复杂性,同时允许结构中的每一个元素操作同一个接口,用于表示“整体-部分”的层次结构。简单理解:树型目录结构。
  6. 适配器模式(Adapter):将一个类的接口转换成用户希望得到的另一个接口,他是原本不相容的接口得以协调工作。简单理解:接口转换。
  7. 桥接模式(Bridge):将一个复杂的组件分成两个独立的但又相关的继承层次结构,将类的抽象部分和他的视线部分分离开来,使他们可以独立的变化。简单理解:继承树拆分。

3、行为型模式

  1. 责任链模式(Chain of Responsibility):可以再系统中建立一个链,这样消息可以再首先接收到他的级别处被处理,或者可以定位到可以处理他的对象。 简单理解:传递职责。
  2. 模板方法模式(Template Method):提供了在不重写方法的前提下允许子类重载部分方法的方法。简单理解:框架
  3. 命令模式(Command):在对象中封装了请求,这样可以保存命令,将该命令传递给方法以及像任何其他对象一样放回该命令。简单理解:日志记录,可撤销
  4. 解释器模式(Interpreter):可以解释定义其语法的语音,还提供了用表示来解释语音中语句的解释器。简单理解:虚拟机的机制。
  5. 策略模式(Strategy):定义一系列算法,把它们的一个个封装起来,并且使他们之间可以互相替换,从而让算法可以独立于使用它的用户而变化。简单理解:多方案切换。
  6. 迭代器模式(Iterator):为集合的有序访问提供了一致的方法,而该集合是独立于基础集合,并与之项分类的。简单理解:数据集。
  7. 状态模式(State):允许一个对象在其内部状态改变时改变它的行为。简单理解:状态变成类。
  8. 备忘录模式(Memento):保持对象状态的“快照(snapshot)”,这样对象可以在不向外界公开其内容的情况下返回到它的最初状态。简单理解:游戏存档
  9. 中介者模式(Mediator):通过引入一个能够管理对象间消息分布的对象,简化了系统中对象间通信。简单理解:不直接引用
  10. 观察者模式(Observer):为组件向相关接收广播消息提供了灵活的方法定义对象间的一种一对多的依赖关系。简单理解:订阅、广播、联动
  11. 访问者模式(Visitor):提供了一种方便的,可以维护的方法来表示在对象结构元素上要进行的操作。简单理解:数据与操作分离

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

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

相关文章

JAVA中Function的使用

JAVA中Function的使用一、方法介绍参数类型方法介绍源码二、demo参考: https://blog.csdn.net/boyan_HFUT/article/details/99618833 一、方法介绍 表示接受一个参数并产生结果的函数。 参数类型 T - 函数输入的类型R - 函数的结果类型 方法介绍 R apply(T t) …

【毕业设计】45-基于单片机的智能温度/超温报警计的系统设计(原理图工程+仿真工程+源代码+答辩论文+答辩PPT)

【毕业设计】45-基于单片机的智能温度/超温报警计的系统设计(原理图工程仿真工程源代码答辩论文答辩PPT) 文章目录【毕业设计】45-基于单片机的智能温度/超温报警计的系统设计(原理图工程仿真工程源代码答辩论文答辩PPT)资料下载链…

Vue 路由

参考文献:Vue中的路由 目录:一、路由理解:二、路由管理器理解:三、路由的使用:四、嵌套路由:五、路由传参:1.query传参:2. params传参:六、编程式路由导航:七、响应路由参…

数字孪生技术有没有真正的实用价值?

作为一个数字孪生领域的技术公司负责人,我尽可能用比较直白的话来描述一下我对数字孪生行业以及数字孪生价值的理解。 纵观数字孪生相关的公司,主要有两个流派,一派是具有互联网基因的数字孪生创业公司,一派是在工业软件领域实力…

ConfigurableListableBeanFactory和BeanDefinitionRegistry关系

前言 :在查看springBoot源码的过程中,遇到了这个问题,上网查了一些资料,理解了一些,这里顺便把这个问题给记录一下。 在springBoot调用Refresh方法里面 ,有一个叫invokeBeanFactoryPostProcessors的方法【…

HIve数仓新零售项目ODS层的构建

HIve数仓新零售项目 注:大家觉得博客好的话,别忘了点赞收藏呀,本人每周都会更新关于人工智能和大数据相关的内容,内容多为原创,Python Java Scala SQL 代码,CV NLP 推荐系统等,Spark Flink Kaf…

WindowsPE(二)空白区添加代码新增,扩大,合并节

空白区添加代码 在 PE 中插入一段调用 MessageBox 的代码。 获取MessageBox地址,构造ShellCode代码 利 OD 定位出 MessageBoxA 函数的地址为 0x77D507EA 。 构造 shellcode : unsigned char shellcode[] {0x6A, 0x00, // pus…

ORB-SLAM2 ---- Initializer::ReconstructF函数

目录 1.函数作用 2.函数解析 2.1 调用函数解析 2.2 Initializer::ReconstructF函数总体思路 2.2.1 代码 2.2.2 总体思路解析 2.2.3 根据基础矩阵和相机的内参数矩阵计算本质矩阵 2.2.4 从本质矩阵求解两个R解和两个t解,共四组解 2.2.5 分别验证求解的4种…

准备面试题【面试】

前言 写作于 2022-11-13 19:27:08 发布于 2022-11-20 16:34:44 准备 程序员囧辉 我要进大厂 面试阿里,HashMap 这一篇就够了 Java 基础高频面试题(2022年最新版) 问遍了身边的面试官朋友,我整理出这份 Java 集合高频面试题…

【mysql】mysql 数据备份与恢复使用详解

一、前言 对一个运行中的线上系统来说,定期对数据库进行备份是非常重要的,备份不仅可以确保数据的局部完整性,一定程度上也为数据安全性提供了保障,设想如果某种极端的场景下,比如磁盘损坏导致某个时间段数据丢失&…

什么是Spring,Spring的核心和设计思想你了解吗?

目录 1.初识Spring 1.1 什么是容器 1.2 什么是IoC 2.什么是IoC容器. 2.1 什么是DI 哈喽呀,你好呀,欢迎呀,快来看一下这篇宝藏博客吧~~~ 1.初识Spring Srping指的是Spring Framework(Spring 框架).我们经常会听见框架二字,其中java中最最主流的框架当属Spring.Spring是一…

SAP S4 FI后台详细配置教程- PART4 (科目及税费相关配置篇)

目录 1、总帐科目 1.1编辑科目表清单 1.2 科目表分配给公司代码 1.3 定义科目组 1.4 定义留存收益科目 2、销售/购置税 2.1 维护销售/购置税务代码税率 2.2 配置销项/销项税会计科目 大家好本篇是:SAP S4 FI后台详细配置教程- PART4 (科目及税…

Fiddler的安装和使用

文章目录1、Fiddler的安装2、Fiddler的使用3、抓包工具的原理1、Fiddler的安装 官网链接:https://www.telerik.com/fiddler 进入官网首页 页面跳转后 2、Fiddler的使用 下载好后直接安装,安装后打开,它就会自动抓取HTTP包,在左…

[附源码]SSM计算机毕业设计-东湖社区志愿者管理平台JAVA

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

力扣113题引发的关于DFS和回溯的一点思考

最近刚学回溯和DFS&#xff0c;刷力扣遇到一道题&#xff08;113题&#xff09;&#xff0c;如下&#xff1a; 我们不细究回溯和DFS的区别联系。关于这道题的2种写法&#xff0c;我把第一种称为回溯。 class Solution {List<List<Integer>> res new LinkedList&l…

29.Nacos的简介与安装(springcloud)

1.Nacos 简介官网&#xff1a; https://nacos.io/zh-cn/Nacos 致力于发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集&#xff0c;帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。 Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是…

【Android Studio Gradle】发布aar到私有Artifactory仓库

1. 前言 在【Android Studio Gradle】使用Artifactory构建本地仓库中介绍了如何利用工具配置一个maven私有库&#xff0c;那么在开发library的时候为了方便难免会用到需要将该库发布到这个仓库的功能。经过测试和配置&#xff0c;确实在Artifactory仓库中也可以通过gradlew命令…

【MySQL基础】为什么大部分人选择使用MySQL数据库?

目录 一、为什么大部分人选择使用MySQL数据库&#xff1f; 二、MySQL简介 1.MySQL介绍 2.MySQL的特点 3. MySQL的版本 从用户的角度&#xff0c;针对不同的用户 从单纯的版本数字区分 &#x1f49f; 创作不易&#xff0c;不妨点赞&#x1f49a;评论❤️收藏&#x1f49…

我把皮小浪の的 蓝色妖姬系列做进了java窗口

— &#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 收录于专栏 unity实战入门 ⭐效果图如下 ⭐⭐涉及的相关类的包含关系图 ⭐# 视频入口&#xff1a;请点击 文章目录一…

比 O(nlog(n)) 做得更好——2.改变问题以及排序和填充数组

改变问题&#xff0c;以及对键进行排序和填充数组。 目录 【第1篇】比 O(nlog(n)) 做得更好——1.创造合适的条件 长按关注《Python学研大本营》&#xff0c;加入读者群&#xff0c;分享更多精彩 扫码关注《Python学研大本营》&#xff0c;加入读者群&#xff0c;分享更多精彩 …