【速览】设计模式(更新中)

news2025/3/12 10:54:52

目录

  • 一、背景
  • 二、优缺点
    • 优点
    • 缺点
  • 三、适用场景
  • 四、核心组成
    • 创建型模式 Creational Design Pattern 5'
    • 结构型模式 Structural Design Patterns 7'
    • 行为型模式 Behavioral Design Patterns 11’
  • 五、底层原理
  • 六、对比
  • 参考

一、背景

这个技术出现的背景、初衷和要达到什么样的目标或是要解决什么样的问题。这个问题非常关键,也就是说,你在学习一个技术的时候,需要知道这个技术的成因和目标,也就是这个技术的灵魂。如果不知道这些的话,那么你会看不懂这个技术的一些设计理念。

设计模式的背景可以追溯到1994年,当时四位作者(Erich Gamma, Richard Helm, Ralph Johnson 和 John Vlissides)出版了一本名为《设计模式:可复用面向对象软件的基础》(Design Patterns: Elements of Reusable Object-Oriented Software)的书。这本书通常被称为“四人帮”(Gang of Four,简称 GoF)的书,因为它是由这四位作者共同编写的。

在这本书中,作者们总结了他们在软件设计中遇到的各种问题,并提出了23种通用的解决方案,这些解决方案后来被称为设计模式。这些模式涵盖了从创建对象到管理对象之间交互的各个方面,为软件开发者提供了一套标准化的方法来解决常见的设计问题。

自 GoF 的书出版以来,设计模式已经成为软件工程领域的一个重要组成部分。随着软件开发技术的发展,新的设计模式不断被发现和提出,同时,一些现有的设计模式也在不断演化和改进。

此外,设计模式的概念也被扩展到其他编程范式和领域,如函数式编程、并发编程、分布式系统等。设计模式不仅限于面向对象编程,它们提供了一种通用的方法论,可以应用于各种不同的软件开发场景。

总之,设计模式的背景是基于对软件设计问题的深入理解和总结,它们提供了一套通用的解决方案,帮助开发者创建更加高效、可维护和可扩展的软件系统。

二、优缺点

这个技术的优势和劣势分别是什么,或者说,这个技术的 trade-off 是什么。任何技术都有其好坏,在解决一个问题的时候,也会带来新的问题。另外,一般来说,任何设计都有 trade-off(要什么和不要什么),所以,你要清楚这个技术的优势和劣势,以及带来的挑战。

优点

  • 提高代码复用性:
    设计模式提供了一套经过验证的解决方案,这些方案可以在不同的项目中重复使用,从而减少重复劳动,提高开发效率。

  • 增强代码的可维护性:
    设计模式有助于创建结构清晰、易于理解和修改的代码。这使得代码在长期维护和迭代过程中更加稳定和可靠。

  • 促进团队协作:
    设计模式提供了一套通用的术语和概念,这有助于团队成员之间的沟通和协作。开发者可以更快速地理解彼此的代码,并在此基础上进行工作。

  • 提升设计质量:
    设计模式鼓励使用面向对象的原则和最佳实践,如封装、继承、多态、单一职责原则、开闭原则等。这些原则有助于创建更加健壮和灵活的软件系统。

  • 解决常见问题:
    设计模式针对软件设计中的一些常见问题提供了具体的解决方案,如对象创建、对象组合、对象交互等。这些解决方案可以帮助开发者避免一些常见的设计陷阱。

缺点

  • 过度设计:
    设计模式有时可能导致过度设计,即在不需要的情况下过度使用设计模式,增加了代码的复杂性,而没有带来实际的好处。

  • 学习曲线:
    设计模式需要一定的学习和理解成本。对于新手开发者来说,理解和正确应用设计模式可能需要一段时间。

  • 代码复杂性:
    设计模式有时会增加代码的复杂性,特别是在小型项目或简单场景中,使用设计模式可能会使代码变得更加难以理解和维护。

  • 性能问题:
    某些设计模式(如代理模式、装饰器模式)可能会引入额外的间接层,这可能会对性能产生一定的影响,尤其是在性能敏感的应用中。

  • 过度抽象:
    设计模式鼓励抽象和封装,但在某些情况下,过度抽象可能会导致代码难以调试和测试,因为具体的实现细节被隐藏在抽象层之后。

三、适用场景

这个技术适用的场景。任何技术都有其适用的场景,离开了这个场景,这个技术可能会有很多槽点,所以学习技术不但要知道这个技术是什么,还要知道其适用的场景。没有任何一个技术是普适的。注意,所谓场景一般分别两个,一个是业务场景,一个是技术场景。

四、核心组成

技术的组成部分和关键点。这是技术的核心思想和核心组件了,也是这个技术的灵魂所在了。学习技术的核心部分是快速掌握的关键。

分为三大类:

  • 创建型模式 Creational Design Pattern 5’

在这里插入图片描述

  • 工厂方法模式 (Factory Method Design Pattern)

  • 抽象工厂模式 (Abstract Factory Method Design Pattern)

  • 单例模式 (Singleton Method Design Pattern)

  • 原型模式 (Prototype Method Design Pattern)

  • 建造者模式 (Builder Method Design Pattern)

  • 结构型模式 Structural Design Patterns 7’

在这里插入图片描述

  • 适配器模式 (Adapter Pattern)

  • 桥接模式(Bridge Pattern)

  • 组合模式(Composite Pattern)

  • 装饰器模式(Decorator Pattern)

  • 外观模式(Facade Pattern)

  • 代理模式(Proxy Pattern)

  • 享元模式(Flyweight Pattern)

  • 行为型模式 Behavioral Design Patterns 11’

在这里插入图片描述

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

五、底层原理

技术的底层原理和关键实现。任何一个技术都有其底层的关键基础技术,这些关键技术很有可能也是其它技术的关键基础技术。所以,学习这些关键的基础底层技术,可以让你未来很快地掌握其它技术。

六、对比

已有的实现和它之间的对比。一般来说,任何一个技术都会有不同的实现,不同的实现都会有不同的侧重。学习不同的实现,可以让你得到不同的想法和思路,对于开阔思维,深入细节是非常重要的。

参考

https://www.geeksforgeeks.org/software-design-patterns/
https://refactoring.guru/design-patterns

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

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

相关文章

【Python开发实践】在线商城系统——需求及需求分析

项目背景及需求 这个练习项目的设置背景是一家图书销售公司,为了扩大销售渠道,想要开通网上商城,利用在线博客和电子商城来销售图书。 具体需求如下: 每个商品可以留言 实现在线购物车处理和订单处理 实现对产品、购物车和订单的…

python | 图片转换为 pdf 实现方法

目录 一、PIL 库简介及安装使用方法 (一)python 不同版本下 PIL 的使用方法 二、图片转换为 pdf 的两种实现方法 (一)简易版——pdf 页面尺寸跟随图片大小 (二)常用版——pdf 每页尺寸统一为 A4 一、P…

C#PACS系统源码,影像存档与传输系统源码,数字化医学影像系统源码,三维重建影像PACS系统源码

C#PACS系统源码,影像存档与传输系统源码,数字化医学影像系统源码,三维重建影像PACS系统源码 PACS即影像存档与传输系统(Picture Archiving and Communication System),是医学影像、数字化图像技术、计算机技…

C++遍历for_each

#include <iostream> #include <stack> #include <vector> #include <algorithm> using namespace std; //打印数组 class bianli { public:void operator()(int val){cout << val << " ";} }; void printVector(int val) {cout…

【经验分享】将ui文件转化成py代码

目录 先写一个简单的ui界面 将ui文件另存为 将UI文件转换为py代码 测试一下你生成的py文件 &#x1f31f; 嗨&#xff0c;我是命运之光&#xff01; &#x1f30d; 2024&#xff0c;每日百字&#xff0c;记录时光&#xff0c;感谢有你一路同行。 &#x1f680; 携手启航&…

第R2周:LSTM-火灾温度预测

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、什么是LSTM 1.LSTM的本质 长短时记忆网络&#xff08;Long Short-Term Memory, LSTM&#xff09;的本质是一种特殊的循环神经网络&#xff08;Recurrent…

《Cloud Native Data Center Networking》(云原生数据中心网络设计)读书笔记 -- 05网络虚拟化

本章帮助网络工程师或架构师回答如下问题&#xff1a; 什么是网络虚拟化?网络虚拟化有哪些用途?网络虚拟化领域内有哪些不同的技术方向?网络虚拟化的控制面有哪些选择?当使用 VXLAN 时如何进行桥接和路由&#xff1f; 什么是网络虚拟化&#xff1f; 网络虚拟化可以让网络…

揭秘!格行如何成为随身WiFi界的‘比亚迪’!如何成为随身WiFi热销第一名?

比亚迪把续航超过2000km的油车打入了10万元以内&#xff01;创造历史&#xff01; 为什么这么说&#xff1f;还不是因为这两辆车都搭载了比亚迪最新研发的第五代 Dmi 混动技术。这项技术有多“逆天”&#xff1f;直接创下了三项全球之最——全球最高发动机热效率、百公里最低油…

CUDA C++ 最佳实践指南

CUDA C 最佳实践指南 (nvidia.com)https://docs.nvidia.com/cuda/cuda-c-best-practices-guide/index.html#getting-started2. 异构计算 CUDA 编程涉及在两个不同的平台上同时运行代码&#xff1a;具有一个或多个 CPU 的主机系统和一个或多个支持 CUDA 的 NVIDIA GPU 设备。 …

Hermite 三次插值可编辑样条

欢迎关注更多精彩 关注我&#xff0c;学习常用算法与数据结构&#xff0c;一题多解&#xff0c;降维打击。 问题描述 利用三次样条和Hermite插值制作一个类似于ppt里的曲线工作。 基本思路 对于给定点&#xff0c;初始生成时用参数化三次函数插值的方式生成。三次样条函数插…

【Py/Java/C++三种语言详解】LeetCode743、网络延迟时间【单源最短路问题Djikstra算法】

可上 欧弟OJ系统 练习华子OD、大厂真题 绿色聊天软件戳 od1441了解算法冲刺训练&#xff08;备注【CSDN】否则不通过&#xff09; 文章目录 相关推荐阅读一、题目描述二、题目解析三、参考代码PythonJavaC 时空复杂度 华为OD算法/大厂面试高频题算法练习冲刺训练 相关推荐阅读 …

Java入门:06.Java中的方法--进阶01

1 JVM中方法的执行过程 1.1 JVM内存模型 在java程序的执行过程中会产生一些数据&#xff0c;这些数据将会存在jvm内存中。 JVM将内存分成了不同的逻辑区域&#xff0c;存储不同含义&#xff08;类别&#xff09;的数据 JVM内存模型有5种 方法区 &#xff1a; 存储类信息 堆…

初识redis:Set类型

Set有很多种含义&#xff0c;比如集合&#xff0c;比如设置&#xff08;和get相对应&#xff09;。 在这里我们说的set是指的redis中的集合&#xff0c;并且这里的集合是无序的&#xff0c;和之前的list是对应的。 List &#xff1a; [1,2,3] 和 [2,1,3] 是两个不同的listSe…

hbase-manager图形化界面的安装与配置

相关资料下载 夸克网盘分享 1、上传项目到linux上 解压&#xff1a; 切换到conf目录下&#xff1a;/opt/installs/hbase-manager-2.0.8-hbase-2.x/conf/ 2、修改数据库配置信息 application-druid.yml 3、创建hbase-manager数据库(注意字符集编码)&#xff0c;导入数据库脚本…

飞鸟物联平台数字化解决方案:全方位提升OEM厂商销售、售后服务能力

自从OEM厂商把设备销售给终端客户&#xff0c;这笔交易就到此为止了。一旦目标行业出现下行趋势&#xff0c;订单和利润往往难以为继&#xff0c;OEM厂商往往遭受着其特有的三重考验&#xff1a;设备状况不透明、设备维保成本高、终端客户粘性低。这些挑战如同“三害”压得OEM厂…

AI搜索产品:秘塔、天工、perplexity、felo、360AI搜索

1、秘塔 https://metaso.cn/ 2、天工 https://www.tiangong.cn/ 3、perplexity https://www.perplexity.ai/ 4、Felo https://felo.ai/search 5、360ai搜索 https://www.sou.com/

洛谷P3865.ST表

洛谷P3865.ST表 i的取值为[1,n−2j1]从而推出j的取值为 j < lg[n]找区间最值时&#xff1a; 要找一段起始点L的可覆盖[L,R]的区间&#xff0c;即L 2k - 1 < R –> k < lg[R-L1] (区间长度)同时起点为 D R - 2k 1 (起始点)即f[D][k] #include <bits/stdc.…

12.1.案例专题-数据流图

文章目录 数据流图结构化语言描述示例 练习题2020年真题2021年上真题 数据流图 数据流图DFD基本图形元素&#xff1a;外部实体、加工、数据存储、数据流。 数据流&#xff1a;由一组固定成分的数据组成&#xff0c;表示数据的流向。在DFD中&#xff0c;数据流的流向必须经过…

IP进程间的通信方式以及不同主机间的通信方式

一&#xff0c;IP进程间的通信方式 共享内存&#xff08;最高效&#xff09; 1.是一块内核的预留空间 2.避免了用户空间到内核空间的数据拷贝 1.产生key:ftok函数 功能&#xff1a;将pathname和pid_id转化为key 参数&#xff1a;(路径名&#xff0c;A) 返回值&#xff1…

Java并发类API——ExecutorService

1.ExecutorService概述 ExecutorService 是 Java 并发库中一个非常重要的接口&#xff0c;它提供了一种管理和控制线程执行的方法。ExecutorService 是 Executor 接口的扩展&#xff0c;除了 Executor 提供的基础任务执行功能之外&#xff0c;ExecutorService 提供了更强大的功…