程序设计模式23+1种定义+UML图(有部分分析和联用)

2023-11-11

程序设计模式这门课已经学完了,复习的时候做了一个这样的汇总,希望可以给后来学习这门课的同学一些帮助。

    • 设计模式的分类
      • 根据目的(模式是用来做什么的)可分为创建型(Creational),结构型(Structural)和行为型(Behavioral)三类:
        •  创建型模式主要用于创建对象
        •  结构型模式主要用于处理类或对象的组合
        •  行为型模式主要用于描述类或对象如何交互和怎样分配职责

    • 面向对象设计原则:
      • 单一职责原则:一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中。
      • 开闭原则:软件实体应当对扩展开放,对修改关闭。
      • 里氏代换原则:所有引用基类的地方必须能透明地使用其子类的对象。
        • 在软件中将一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常,反过来则不成立。
        • 在程序中尽量使用基类类型来对对象进行定义,而在运行时再确定其子类类型
      • 依赖倒转原则:高层模块不应该依赖低层模块,它们都应该依赖抽象。抽象不应该依赖于细节,细节应该依赖于抽象。
      • 接口隔离原则:客户端不应该依赖那些它不需要的接口
      • 合成复用原则:优先使用对象组合,而不是继承来达到复用的目的。
      • 迪米特法则:每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位。

    • 创建型模式
    • 简单工厂模式 (Simple Factory Pattern):定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。
      • 不符合开闭原则
      • 简单工厂模式的简化:将抽象产品类和工厂类合并,将静态工厂方法移至抽象产品类中

    • 工厂方法模式:定义一个用于创建对象的接口,但是让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。
      • 符合开闭原则

    • 抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。
      • 新增产品族支持开闭原则
      • 新增产品结构违背开闭原则

    • 建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

    • 原型模式:使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象。
      • 浅克隆和深克隆
      • 违背开闭原则

    • 单例模式:确保一个类只有一个实例,并提供一个全局访问点来访问这个唯一实例。
      • 要点:
        • 某个类只能有一个实例
        • 必须自行创建这个实例
        • 必须自行向整个系统提供这个实例
        • 饿汉式单例类:
          • 属性就是单例,直接getinstance就可以
        • 懒汉式单例类
          • 锁方法延迟,双重锁定,两次判断instance==null

结构型模式

    • 结构型模式(Structural Pattern)关注如何将现有类或对象组织在一起形成更加强大的结构
    • 不同的结构型模式从不同的角度组合类或对象,它们在尽可能满足各种面向对象设计原则的同时为类或对象的组合提供一系列巧妙的解决方案
    • 适配器模式:将一个类的接口转换成客户希望的另一个接口。适配器模式让那些接口不兼容的类可以一起工作。
    • 桥接模式:将抽象部分与它的实现部分解耦,使得两者都能够独立变化。

    • 组合模式:组合多个对象形成树形结构以表示具有部分-整体关系的层次结构。组合模式让客户端可以统一对待单个对象和组合对象。

    • 透明组合模式:抽象构建就声明函数
      • 好处,客户端一视同仁
      • 问题,不安全
    • 安全组合模式:抽象构件就一个operation,剩下的要在composite里自己声明
      • 问题,不透明,区别对待叶子和容器

    • 装饰模式:动态地给一个对象增加一些额外的职责。就扩展功能而言,装饰模式提供了一种比使用子类更加灵活的替代方案。

    • 外观模式:为子系统中的一组接口提供一个统一的入口。外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

facade那里直接init子系统,做个函数都用上就可以了

    • 享元模式:通过共享技术实现相同或相似对象的重用
      • 享元池(Flyweight Pool):存储共享实例对象的地方
      • 享元模式:运用共享技术有效地支持大量细粒度对象的复用。

    • 代理模式:给某一个对象提供一个代理或占位符,并由代理对象来控制对原对象的访问。
      • 常见的有多种代理模式:
        • 远程,虚拟,缓冲,保护,智能引用

    • 当客户端对象需要访问远程主机中的对象时可以使用远程代理
    • 当需要用一个消耗资源较少的对象来代表一个消耗资源较多的对象,从而降低系统开销、缩短运行时间时可以使用虚拟代理
    • 当需要为某一个被频繁访问的操作结果提供一个临时存储空间,以供多个客户端共享访问这些结果时可以使用缓冲代理
    • 当需要控制对一个对象的访问,为不同用户提供不同级别的访问权限时可以使用保护代理
    • 当需要为一个对象的访问(引用)提供一些额外的操作时可以使用智能引用代理

    • 行为型模式:
      • 行为型模式(Behavioral Pattern) 关注系统中对象之间的交互,研究系统在运行时对象之间的相互通信与协作,进一步明确对象的职责
      • 行为型模式:不仅仅关注类和对象本身,还重点关注它们之间的相互作用和职责划分

    • 职责链模式:避免将一个请求的发送者与接收者耦合在一起,让多个对象都有机会处理请求。将接收请求的对象连接成一条链,并且沿着这条链传递请求,直到有一个对象能够处理它为止。
      • 记得抽象类要可以设置下家的函数(successor)

    • 命令模式:将一个请求封装为一个对象,从而让你可以用不同的请求对客户进行参数化,对请求排队或者记录请求日志,以及支持可撤销的操作。
        • 有一个小套娃,invoker有command,可以调用execute,实现receiver的action

    • 解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
      • 非终结部分需要两个抽象表达符号,递归进行interpret

    • 迭代器模式:提供一种方法顺序访问一个聚合对象中各个元素,且不用暴露该对象的内部表示。
      • 符合开闭原则,如果不动迭代器方法的话
      • 用在访问聚合对象的内部环境里

    • 中介者模式:定义一个对象来封装一系列对象的交互。中介者模式使各对象之间不需要显式地相互引用,从而使其耦合松散,而且让你可以独立地改变它们之间的交互。
      • 是迪米特法则的典型应用

    • 备忘录模式:在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样就可以在以后将对象恢复到原先保存的状态。

    • 观察者模式:定义对象之间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象都得到通知并被自动更新。
      • 目标类中应该含有观察者列表
      • 增加新的具体目标类,在一定程度上违背了开闭原则
      • 但是整体是符合开闭原则的。增加新的具体观察者无须修改原有系统代码,在具体观察者与观察目标之间不存在关联关系的情况下,增加新的观察目标也很方便

    • 状态模式:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。
      • request:调用对应状态的handle
      • 对于开闭原则的支持性不太好

    • 策略模式:定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法可以独立于使用它的客户变化。
      • 使用环境:
        • 一个系统需要动态地在几种算法中选择一种
        • 避免使用难以维护的多重条件选择语句
        • 不希望客户端知道复杂的、与算法相关的数据结构,提高算法的保密性与安全性

    • 模板方法模式:定义一个操作中算法的框架,而将一些步骤延迟到子类中。模板方法模式使得子类不改变一个算法的结构即可重定义该算法的某些特定步骤。

    • 如果需要更换或增加具体子类,无须修改源代码,只需修改配置文件即可,符合开闭原则
    • 也符合单一职责原则
    • 可以配合桥接模式

    • 访问者模式:表示一个作用于某对象结构中的各个元素的操作。访问者模式让你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
      • 开闭原则的倾斜性
      • 访问者模式可以和组合模式联用

    • 一个对象结构包含多个类型的对象,希望对这些对象实施一些依赖其具体类型的操作
    • 需要对一个对象结构中的对象进行很多不同的且不相关的操作,并需要避免让这些操作“污染”这些对象的类,也不希望在增加新操作时修改这些类
    • 对象结构中对象对应的类很少改变,但经常需要在此对象结构上定义新的操作
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

程序设计模式23+1种定义+UML图(有部分分析和联用) 的相关文章

  • 如何从 python 脚本执行 7zip 命令

    我试图了解如何使用 os system 模块来执行 7zip 命令 现在我不想用 Popen 或 subprocess 让事情变得复杂 我已经安装了 7zip 并将 7zip exe 复制到我的用户文件夹中 我只想提取我的测试文件 inst
  • 从关卡堆栈中获取相对比例的数学

    为这个可怕的标题道歉 我花了 10 分钟试图用一句话来解释这一点 但失败了 虽然提示这个问题的应用程序是用Java Android 编写的 但我认为它非常通用并且适用于任何语言 欢迎使用伪代码 或简单的英语 回复 我不确定是否应该标记所有通
  • Java元数据读写

    是否可以以通用方式 对于所有图像类型 在 Java 中读取和写入元数据 我找到了一些示例 但它们总是特定的 例如 JPEG 或 PNG 我需要一些足够通用的东西 而不是到处都有 if else 语句 我不想重写源代码 但这是一个很好的例子
  • Python:导入模块一次然后与多个文件共享

    我有如下文件 file1 py file2 py file3 py 假设这三个都使用 lib7 py lib8 py lib9 py 目前 这三个文件中的每一个都有以下行 import lib7 import lib8 import lib
  • 如何从 Google Custom Search API 获取超过 100 个结果

    我正在尝试使用 Google Custom Search API 在 Java 中进行研究 因此 我需要为每个查询提供一个大的结果集 然而 我似乎仅限于前 100 个结果 这比我需要的要少得多 我使用这样的列表方法 list setStar
  • 如何使用 Guava 连接字符串?

    我写了一些代码来连接字符串 String inputFile for String inputLine list inputFile inputLine trim 但我不能使用 连接 所以我决定使用 Guava 所以我需要使用Joiner
  • 使用Java开发跨平台,不同平台字体缩放不同

    我正在为我的大学制作一些软件 需要一个 GUI 在它的第一个版本中 我让它使用系统外观 因此它看起来像 Linux Mac Windows 中的本机应用程序 我发现这很麻烦 因为我必须根据操作系统使所有 JLabel 具有不同的大小 无论分
  • 为什么现在()? (客观化)

    为什么我想要异步加载 Objectify 实体 异步加载到底意味着什么 根据客观化有关加载的文档 https code google com p objectify appengine wiki BasicOperations Loadin
  • 如何将 URL 添加到 Telegram Bot 的 InlineKeyboardButton

    我想制作一个按钮 可以从 Telegram 聊天中在浏览器中打开 URL 外部超链接 目前 我只开发了可点击的操作按钮 update message reply text Subscribe to us on Facebook and Te
  • 数据损坏 C++ 和 Python 之间的管道

    我正在编写一些代码 从 Python 获取二进制数据 将其通过管道传输到 C 对数据进行一些处理 在本例中计算互信息度量 然后将结果通过管道传输回 Python 在测试时 我发现如果我发送的数据是一组尺寸小于 1500 X 1500 的 2
  • 是否可以为 azure blob 存储中的给定目录生成具有写入权限的 SAS(共享访问签名)

    我们的 blob 存储帐户结构 容器名称 simple 在这个容器内我们有 blob aa one zip aa two zip bb ss zip bb dd zip 是否可以生成对aa 目录 有写权限 但对bb 目录 没有访问权限的SA
  • 如何在引发异常时将变量传递给异常并在异常时检索它?

    现在我只有一个空白的异常类 我想知道如何在引发变量时给它一个变量 然后在 try except 中处理它时检索该变量 class ExampleException Exception pass 为其构造函数提供一个参数 将其存储为属性 然后
  • 无法映射 ftl 文件中的 jsonRequest 属性

    我想在 FTL 文件中映射下面的 json 文件市场和子市场字段 但是当我尝试下面的代码时 它没有映射 有人可以帮助我吗 我从 2 天开始就无法映射它 Json请求 ProcessOrderRequest prevalidationMode
  • AWS 将 MQTT 消息存储到 DynamoDB

    我构建了一个定期发送 MQTT 消息的 python 脚本 这是发送到后端的 JSON 字符串 Id 1234 Ut 1488395951 Temp 22 86 Rh 48 24 在后端 我想将 MQTT 消息存储到 DynamoDB 表中
  • 用 pandas DataFrame 替换 mysql 数据库表中的行

    Python 版本 2 7 6 熊猫版本 0 17 1 MySQLdb 版本 1 2 5 在我的数据库中 PRODUCT 我有一张桌子 XML FEED 表 XML FEED 很大 数百万条记录 我有一个 pandas DataFrame
  • 为什么从 openAI 导入 Universe 模块时出现“无效语法”错误

    当我导入时universe来自 openAI 的模块 我收到以下错误 Traceback most recent call last File
  • 读/写带有特殊字符的.txt文件

    I open Notepad Windows 并写 Some lines with special characters Special 并前往另存为 someFile txt 与Encoding set to UTF 8 在Java中我有
  • 从 Django 运行 shell 命令

    我正在 Django 中开发一个网页 使用 apache 服务器 需要调用 shell 命令来启用 禁用一些守护进程 我尝试这样做 os system service httpd restart 1 gt HOME out 2 gt HOM
  • H2 用户定义的聚合函数 ListAgg 不能在第一个参数上使用 DISTINCT 或 TRIM()

    所以我有一个 DB2 生产数据库 我需要在其中使用可用的函数 ListAgg 我希望使用 H2 的单元测试能够正确测试此功能 不幸的是H2不直接支持ListAgg 但是 我可以创建一个用户定义的聚合函数 import java sql Co
  • 如何使用剪辑来减少绘画时间?

    我正在尝试使用 Clip 来减少 CPU 负载 但剪辑在屏幕上留下了一些我似乎无法摆脱的垃圾 另外 打开和关闭剪辑似乎对 CPU 负载没有影响 在任一情况下 大部分时间似乎都花在重绘管理器和绘制缓冲图像上 import static jav

随机推荐

  • 40张最全计算机网络基础思维导图

    hi 大家好 今天的网络基础思维导图主要是二 三层网络协议 再配合之前的文章 四层以上互联网核心协议 TCP IP协议精华指南pdf发布 非常适合对网络感兴趣的同学 同时也让大家对整个网络架构有一个整体的认识 希望大家喜欢 传输介质简介 以
  • 几种网络通信协议

    应用层 HTTP Hypertext Transfer Protocol 超文本传输协议 显示网页 DNS Domain Name System 域名系统 FTP File Transfer Protocol 文件传出协议 SFTP SSH
  • BAPI_GOODSMVT_CREATE物料凭证创建…

    BAPI GOODSMVT CREATE可以实现物料凭证创建和部分冲销 全部冲销可以使用BAPI GOODSMVT CANCEL CALL FUNCTION BAPI GOODSMVT CREATE EXPORTING GOODSMVT H
  • Caffe中Solver解析

    1 Solver的初始化 shared ptr
  • QT中默认不选中Shadow build设置方法

    在使用qt开发的时候 每次创建工程 都会默认选中shadow build影子构建 作用是把编译生成的文件与源文件放在不同的目录 这样源码目录就相对整洁 但是这也会带来个问题 感觉超级鸡肋 就是经常修改了代码之后点运行 跑的还是修改之前的程序
  • 使用VMware Workstation Player虚拟机安装Linux系统

    下载安装 VMware Workstation Player 首先下载并安装 VMware Workstation Player VMware Workstation是一款非常强大的虚拟机软件 有pro专业版和player免费版 我们个人使
  • Java线程协作的两种方式

    介绍 Java中线程协作的最常见的两种方式 利用Object wait Object notify 和使用Condition 方法一 Object中的wait notify notifyAll方法定义如下 public final nati
  • 基于域名的恶意网站检测

    基于域名的恶意网站检测 0x00 数据来源 0x01 基于网页内容的判别方法 0x02 基于域名数据的判别方法 0x03 参考文献 0x00 数据来源 根据老师给的 300w 域名列表爬到的相应 DNS 响应数据 0x01 基于网页内容的判
  • 【翻译】 2.6 中的 4K 堆栈 [发布于 2004 年 5 月 12 日,作者:corbet

    传统上 Linux 内核在大多数架构上都使用 8KB 内核堆栈 该堆栈必须满足系统调用可能产生的任何调用序列 以及可能同时调用的任何 硬或软 中断处理程序的需要 实际上 在稳定的内核中 堆栈溢出的情况几乎闻所未闻 内核开发人员早已学会避免使
  • 【Docker教程(一)】WSL2、Docker以及docker-compose安装及环境配置

    一 如何安装WSL2 二 如何安装和配置docker 三 如何安装docker compose 四 如何基于ip代理池获取代理ip 注意 先安装WSL2 再安装docker和docker compose 参考资料 软件下载及安装教程 a d
  • JavaScript循环语句和分支语句

    JavaScript中的分支语句 1 if分支语句 2 if else语句 3 if else if else语句 4 switch语句 注 if语句可以单独存在 else语句不能单独存在 else找离自己最近的同一级别的if搭配成对 在i
  • linux创建711文件,linux权限---【600,644,700,755,711,666,777】,644711

    linux权限 600 644 700 755 711 666 777 644711 chmod命令详解 使用权限 所有使用者 使用方式 chmod cfvR help version mode file 说明 Linux Unix 的档案
  • 用streamlit,几行代码就可以拥有漂亮图表!

    大家注意 因为微信最近又改了推送机制 经常有小伙伴说错过了之前被删的文章 比如前阵子冒着风险写的爬虫 再比如一些限时福利 错过了就是错过了 所以建议大家加个星标 就能第一时间收到推送 大家好 我是爱搞事情的了不起 之前我们爬过懂车帝的车型评
  • c语言报告 列主元lu分解,求助:求个R语言的选主元LU分解。

    推荐答案 上善若水666 来自团队 乐于助人2018 04 21 采纳率 57 等级 50 已帮助 96万人 可以 这是数值分析书上的定理 就是存在排列矩阵P 对换矩阵的乘积 使得PA LU 这个定理说明先对A进行对换矩阵的行得到PA 然后
  • 【面试题】1、总结面试题1

    1 Java语言有哪些特点 1 面向对象 Java是一种面向对象的语言 支持封装 继承和多态等面向对象的特性 Java特别强调类和对象的关系 要求所有代码都必须位于类中 和Java一样很流行的Python也是面向对象的语言 但它对面向对象的
  • PVE虚拟化平台之安装Ubuntu Desktop系统

    PVE虚拟化平台之安装Ubuntu Desktop系统 一 Ubuntu介绍 1 1 Ubuntu简介 1 2 Ubuntu版本 1 3 ubuntu命名规则 二 上传镜像到PVE 2 1 检查PVE环境 2 2 上传镜像到PVE 三 新建
  • ARM软件测试库STL( Software Test libraries )介绍

    原文链接 https www arm com zh TW products development tools embedded and software software test libraries Faster Safety Comp
  • XXL-JOB 分布式定时任务调度平台

    文章目录 1 概述 2 使用 1 概述 首先我们要知道什么是XXL JOB 官方简介 XXL JOB是一个分布式任务调度平台 其核心设计目标是开发迅速 学习简单 轻量级 易扩展 现已开放源代码并接入多家公司线上产品线 开箱即用 XXL JO
  • JavaScript/ES6中的Object

    记录Object构造函数的一些静态方法 Object是编程中常见的一种构造函数 创建一个对象包装器 为什么说是创建了一个对象包装器 Object构造器会根据传入的参数的类型 将参数包装成具体的对象 如有数字对象 boolean对象 字符串对
  • 程序设计模式23+1种定义+UML图(有部分分析和联用)

    程序设计模式这门课已经学完了 复习的时候做了一个这样的汇总 希望可以给后来学习这门课的同学一些帮助 设计模式的分类 根据目的 模式是用来做什么的 可分为创建型 Creational 结构型 Structural 和行为型 Behaviora