设计模式—23种设计模式重点 表格梳理

设计模式的核心在于提供了相关的问题的解决方案,使得人们可以更加简单方便的复用成功的设计和体系结构。

按照设计模式的目的可以分为三大类。创建型模式与对象的创建有关;结构型模式处理类或对象的组合;行为型模式对类或对象怎样交互和怎样分配职责进行描述。

创建型结构型行为型
工厂模式适配器类

解释器

模版方法

对象

抽象工厂

生成器

原型

单例模式

适配器对象

桥接

组合

装饰

外观

享元

代理

责任链

命令

迭代器

中介者

备忘录

观察者

状态

策略

访问者

创建型设计模式:

创建型设计模式简要辨析:

工厂

提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。

适用于:

·一个系统要独立于他的产品创建、组合和表示时;

·一个系统要由多个产品系列中的一个来配置时;

·当要强调一系列相关的产品对象的设计以便进行联合使用时。

抽象工厂

定义一个用于创建对象的接口,让子类决定实例化哪一个类。

适用于:

·一个类不知道他所必须创建的对象的类的时候;

·当一个类希望由他的子类来指定他所创建的对象的时候;

生成器

将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示。

适用于:

·当创建复杂对象的算法应该被独立于该对象的组成部分以及他们的装配方式时;

·当构造过程必须允许被构造的对象有不同表示时。

原型

用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。

适用于:

·当一个系统应该独立于他的产品的创建、构成和表示时;

·当要实例化的类是在运行时刻指定时。

单例

保证一个类仅有一个实例,并提供一个访问他的全局访问点。

适用于:

·当一个类只能有一个实例且客户可以从一个众所周知的访问点访问他时;

·当这个唯一的实例应该是通过子类化可扩展的,并且客户无需更改代码就能使用一个扩展的实例时。

结构型设计模式:

结构型设计模式简要辨析:

适配器(类)

将一个类的接口转换成客户希望的另一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

适用于:

·想使用一个已经存在的类,而他的接口不符合要求;

·想创建一个可以服用的类,该类可以与其他不相关的类或不可预见的类协同工作;

适配器(对象)·(仅适用于对象Adapter)想使用一个已经存在的子类,但是不可能对每一个都进行子类化以自动匹配他们的接口。对象适配器可以适配他的父类接口。
桥接

将抽象部分与其实现部分分离,使他们都可以独立的变化。

适用于:

·不希望在抽象和他的实现部分之间有一个固定的绑定关系;

·类的抽象以及他的实现都应该通过生成子类的方法加以扩充;

·对一个抽象的实现部分的修改应对客户不产生影响,即客户不必重新编码。

组合

使得用户对单个对象和组合对象的使用具有一致性。

适用于:

·想表示对象的部分-整体层次结构;

·希望用户忽略组合对象与单个对象的不同,用户将统一的使用组合结构中的所有对象

装饰器

动态的给一个对象添加一些额外的职责。

适用于:

·动态、透明的给单个对象添加职责;

·处理那些不可撤销的职责。

外观

为子系统中一组接口提供一个一致的界面。

适用于:

·要为一个复杂子系统提供一个简单接口;

·客户程序与抽象类的实现部分之间存在很大依赖性。

享元

运用共享技术有效的支持大量细粒度的对象。

适用于:

·一个应用程序使用了大量的对象;

·完全由于使用大量的对象,造成很大存储的开销;

·对象的大多数状态都可以变为外部状态。

代理

为其他对象提供一种代理以控制这个对象的访问。

适用于:

·远程代理(Remote Proxy)为一个对象在不同地址空间提供局部代表;

·虚代理(Virtual Proxy)根据需要创建开销很大的对象

·……

行为设计模式:
解释器

给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。

适用于:

·该文法简单;

·效率不是一个关键问题。

模版方法

定义一个操作中的算法骨架,而将一些步骤延迟到子类中。

适用于:

·一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现;

·各子类中公共的行为应被提取出来并集中到一个公共父类中,避免代码重复。

责任链

使多个对象都有机会处理请求。将这些对象连成一条链,并沿着这条链传递该请求,知道有一个对象处理它为止

适用于:

·有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定;

·想在不明确指令接受者的情况下向多个对象提交一个请求;

·可处理一个请求的对象集合应被动态指定。

命令

将一个请求封装成一个对象,从而使得可以用不同的请求对客户端进行参数化。

适用于:

·抽象出待执行的动作以参数化某对象;

·在不同时刻指定、排列和执行请求;

·支持取消操作。

迭代器

提供一种方法顺序访问一个聚合对象中的各个元素,且不需要暴露该对象的内部表示。

适用于:

·访问一个聚合对象的内容而无需暴露他的内部表示;

·支持对聚合对象的多种遍历;

·为遍历不同的聚合结构提供一个统一的接口

中介者

用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互。

适用于:

·一组对象以定义良好但是复杂的方式进行通信,产生的相互依赖关系结构混乱且难以理解;

·一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象;

·想定制一个分布在多个类中的行为,而又不想生成太多的子类。

备忘录

在不破坏封装性的前提下捕获一个对象的内部状态,并在对象之外保存这个状态,这样以后就可以恢复到原先保存的状态。

适用于:

·必须保存一个对象在某一个时刻(部分)的状态;

·直接用接口来让其他对象得到状态会暴露对象的实现细节并破坏封装性。

观察者

当一个对象的状态发生改变时,所有依赖于他的对象都得到通知并被自动更新。

适用于:

·当一个对象的改变需要同时改变其他对象,而不知道具体有多少对象有待改变;

·当一个对象必须通知其他对象,而又不能假定其他对象是谁。

状态

允许一个对象在其内部状态改变时改变他的行为。对象看起来似乎修改了他的类。

适用于:

·一个对象的行为决定于他的状态,并且必须在运行时根据状态改变他的行为。

策略

定义一系列的算法,把它们封装起来,并且使他们可以相互替换,使得算法可以独立于使用他们的客户而变化。

适用于:

·许多相关的类仅仅是行为有异;

·需要使用一个算法的不同变体;

·算法使用客户不应该知道的数据;

·一个类定义了多种行为。

访问者

允许在不改变各类元素的类的前提下定义作用于这些元素的新操作。

适用于:

·一个对象结构包含很多类对象,它们有不同的接口,而用户想对这些对象实施一些依赖于其具体类的操作;

·定义对象结构的类很少改变,但经常需要在此结构上定义新的操作。

创建型有四五,工厂原型单例数;
结构型有六,适配桥接装饰顾;
代理组合和外观,享元也是其中属;
行为型有十一,模板策略责任聚;
命令查询观察者,状态访问中介续;
迭代器和解释,行为模式心中记。

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

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

相关文章

视频怎么转换成二维码图片?视频做成二维码播放的方法

怎样在电脑上制作可以播放视频的二维码呢?很多日常生活中,很多的场景或者物品都会有自己的二维码,其他人通过扫码就可以获取对应的内容。有很多场景下会把视频转换二维码,通过扫码在手机上查看视频内容,比如产品介绍、…

408数据结构-图的基本概念 自学知识点整理

*第六章个人感觉是最难的,请各位抓稳扶手,系好安全带。 图的定义 通俗来讲,一个图由一些点和连接这些点的若干边组成,边的两头必须都有顶点,否则不是图。 注:G: Graph; V: Vertex; …

Hive安装教程

前置条件:hadoop&mysql docker容器安装mysql-CSDN博客 以下的/opt/bigdata目录根据自己实际情况更改 1.上传hive包并解压 tar -zxvf apache-hive-3.1.3-bin.tar.gz -C /opt/bigdata/ 2.修改路径 mv /opt/bigdata/apache-hive-3.1.3-bin/ hive cd /opt/bigdata/hive/…

螺旋矩阵的思想

方阵类型 https://leetcode.cn/problems/spiral-matrix-ii/ lc59: 螺旋矩阵, 解题思路 关键点: 上方, 从左到右; 右侧,从上到下; 下方,从右到左; 左侧, 从下往上&…

加密与解密(第四版)】第二十五章笔记

第二十五章 数据取证技术 25.1 硬盘数据的获取和固定 取证专用的Linux可启动光盘 硬盘复制机 利用取证计算机复制硬盘 手机(JTAG) 电子数据的固定(HASH值) 25.2 硬盘的分区和数据恢复 25.3 内存分析 25.4 动态仿真技术 25.…

SpringBoot——整合Thymeleaf模板

目录 模板引擎 新建一个SpringBoot项目 pom.xml application.properties Book BookController bookList.html ​编辑 项目总结 模板引擎 模板引擎是为了用户界面与业务数据分离而产生的,可以生成特定格式的页面在Java中,主要的模板引擎有JSP&…

探索Python编程世界:从基础到实战

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、Python语言简介与动态特性 代码示例:动态类型与变量命名 二、Python应用领…

【软件设计师】大题

一、数据流图 基础知识 数据流图(Data Flow Diagram,DFD)基本图形元素: 外部实体(External Agent) 表示存在于系统之外的对象,用来帮助用户理解系统数据的来源和去向加工(Process)数…

犀牛8 for Mac/Win:重塑三维建模的新标杆

在数字创意的浪潮中,犀牛8(Rhinoceros 8)作为一款卓越的三维建模软件,以其强大的功能和出色的性能,在Mac和Windows平台上都赢得了广大设计师和工程师的青睐。 犀牛8不仅继承了前代产品的优秀基因,更在细节…

从 0 开始本地部署大语言模型

1、准备 ● Ollama:ollama.com ● Docker:https://docs.openwebui.com/ 2、下载 Ollama 进入 Ollama 官网,点击 Download 。 下载完成后,双击安装,什么都不需要勾选,直接下一步即可。安装完成&#xf…

[读论文]精读Self-Attentive Sequential Recommendation

论文链接:https://arxiv.org/abs/1808.09781 其他解读文章:https://mp.weixin.qq.com/s/cRQi3FBi9OMdO7imK2Y4Ew 摘要 顺序动态是许多现代推荐系统的一个关键特征,这些系统试图根据用户最近执行的操作来捕获用户活动的“上下文”。为了捕捉…

Hive运行错误

Hive 文章目录 Hive错误日志错误SessionHiveMetaStoreClientql.Driver: FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTaskerror: Could not find or load main class org.apache.hadoop.mapreduce.v2.app.MRAppMaster Please check …

GIT 新建分支和合并分支

文章目录 前言一、新建分支二、切回老分支,保留新分支的更改三、合并分支 前言 本文主要针对以下场景进行介绍: 场景一:创建新的分支 当前分支(dev_1)已经开发完毕,下一期的需求需要在新分支(dev_2)上进行开发,如何创…

每日5题Day8 - LeetCode 36 - 40

每一步向前都是向自己的梦想更近一步,坚持不懈,勇往直前! 第一题:36. 有效的数独 - 力扣(LeetCode) 题目要求我们进行判断,我们不需要自己填写,所以要一个标志位,来看当…

LLM——探索大语言模型在心理学方面的应用研究

1. 概述 心理学经历了多次理论变革,目前人工智能(AI)和机器学习,特别是大型语言模型(LLMs)的使用,预示着新研究方向的开启。本文详细探讨了像ChatGPT这样的LLMs如何转变心理学研究。它讨论了LL…

从旅游广告联想到《桃花源记》

近日收到《长江头条网》等知名网络自媒体相邀,促我写点儿旅游题材的文案。虽说笔者游历过许多名山大川的绝美风景区,但那是在70岁之前的事儿了。如今年逾78岁,纵使有少许自有资本能够支持出游,可体力难撑,岂不是花钱买罪受吗?而且,写没有亲身经历过的事挺难,即便发表出…

台灯的功能作用有哪些?护眼台灯真的护眼吗?

现在的学生会长时间使用平板、手机、电脑等,这些设备的屏幕会产生一定的频闪和蓝光辐射,也就会影响视力健康,而护眼养眼也成了家长关注的问题,视力疲劳和眼部疾病不仅影响个体的生活质量,还可能导致长期的健康问题。当…

装修:尽显个性品味

家,是心灵的港湾,也是生活的舞台。装修,不仅是对空间的改造,更是对生活态度的诠释。无论是温馨的北欧风,还是华丽的欧式古典,或是简约的现代感,我们的专业团队都能为您量身打造。每一个细节&…

力扣--哈希表13.罗马数字转整数

首先我们可以知道,一个整数,最多由2个罗马数字组成。 思路分析 这个方法能够正确将罗马数字转换为阿拉伯数字的原因在于它遵循了罗马数字的规则,并且对这些规则进行了正确的编码和处理。 罗马数字规则 罗马数字由以下字符组成&#xff1a…

如何使用ffmpeg 实现10种特效

相关特效的名字 特效id 特效名 1 向上移动 2 向左移动 3 向下移动 4 颤抖 5 摇摆 6 雨刷 7 弹入 8 弹簧 9 轻微跳动 10 跳动 特效展示(同时汇总相关命令) pad背景显示 pad背景透明 相关命令(一会再讲这些命令,先往下看) # 合成特效语音 ffmpeg -y -loglevel erro…