0.设计模式总览——设计模式入门系列

news2024/9/23 23:02:43

在现代软件开发中,设计模式为我们提供了优秀的解决方案,帮助我们更好地组织代码和架构。本系列专栏将对设计模式的基本思想、原则,以及常用的分类、实现方式,案例对比、以及使用建议,旨在提高开发者对设计模式的理解和应用。

文章目录

  • 一、了解六大设计原则
  • 二、 掌握六个类与类之间的关系
  • 三、设计模式的分类
  • 四、 设计模式详解与对比
    • 1、创建型模式对比
    • 2、结构型模式对比
    • 3、行为型模式对比
  • 五 、模式应用场景总结
  • 六、订阅

导航图:
在这里插入图片描述

一、了解六大设计原则

  • 单一职责原则(SRP, Single Responsibility Principle): 一个类应该只有一个引起变化的原因,避免职责混杂。
  • 开放封闭原则(OCP, Open/Closed Principle): 软件实体应该对扩展开放,对修改封闭,强调通过扩展而非修改来应对变化。
  • 里氏替换原则(LSP, Liskov Substitution Principle): 子类对象必须能够替换父类对象而不影响程序正确性,确保继承关系的合理性。
  • 接口隔离原则(ISP, Interface Segregation Principle): 客户端不应该被迫依赖于它不使用的接口,强调小而专一的接口设计。
  • 依赖倒置原则(DIP, Dependency Inversion Principle): 高层模块不应该依赖于低层模块,二者都应该依赖于抽象;抽象不应该依赖于细节,细节应该依赖于抽象。
  • 迪米特法则(LoD, Law of Demeter): 一个对象应该对其他对象有最少的了解,降低系统的耦合度。

二、 掌握六个类与类之间的关系

  • 依赖(Dependency): 一个类使用另一个类的实例,通常表现为方法参数或局部变量。
  • 关联(Association): 一个类知道另一个类的存在,表现为成员变量(弱关联)。
  • 聚合(Aggregation): 一种特殊的关联关系,表现为“整体-部分”的关系,整体和部分可以独立存在。
  • 组合(Composition): 一种强聚合关系,整体负责部分的生命周期,部分不能独立于整体存在。
  • 继承(Inheritance): 一个类通过继承另一个类来获得其方法和属性。
  • 实现(Realization): 类与接口之间的关系,类实现接口的方法。

三、设计模式的分类

  1. 创建型模式 (Creational Patterns)
    创建型模式主要关注对象的创建过程,旨在通过某种方式来控制对象的创建,减少代码中对对象的直接创建依赖,使得系统在需要扩展时更加灵活。常见的创建型模式包括:

    • 工厂方法模式 (Factory Method)
    • 抽象工厂模式 (Abstract Factory)
    • 单例模式 (Singleton)
    • 原型模式 (Prototype)
    • 建造者模式 (Builder)
  2. 结构型模式 (Structural Patterns)
    结构型模式关注类与对象的组合,简化并优化不同类和对象之间的关系。常见的结构型模式包括:

    • 适配器模式 (Adapter)
    • 装饰器模式 (Decorator)
    • 代理模式 (Proxy)
    • 外观模式 (Facade)
    • 桥接模式 (Bridge)
    • 组合模式 (Composite)
    • 享元模式 (Flyweight)
  3. 行为型模式 (Behavioral Patterns)
    行为型模式关注对象间职责的分配以及对象如何交互。它们提供了各种方式来组织和管理复杂的控制流。常见的行为型模式包括:

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

四、 设计模式详解与对比

设计模式分为三大类:创建型模式、结构型模式和行为型模式。为了清晰地展示每个模式的特性、适用场景及优缺点,下面用表格形式进行对比。

1、创建型模式对比

模式意图适用场景优点缺点
工厂方法定义一个创建对象的接口,让子类决定实例化哪个类。当类不知道它所必须创建的对象类,或者希望子类来决定创建对象时。通过将对象的创建过程交给子类,降低了与具体类的耦合。难以管理复杂产品层次结构,增加了系统的复杂性。
抽象工厂提供一个接口以创建一组相关或依赖的对象,而无需指定具体类。系统要独立于产品的创建和组成部分,并且需要提供一组相关对象时。符合开闭原则,增强产品族的扩展性和一致性。增加系统复杂度,扩展新的产品族时需要修改所有工厂类。
单例模式确保一个类只有一个实例,并提供一个全局的访问点。控制全局共享资源,例如日志记录器、配置文件类、线程池等。全局只有一个实例,节省了系统资源,避免不必要的重复实例化。难以扩展,违反单一职责原则,可能导致类膨胀,难以测试。
原型模式使用现有的实例来复制生成新对象,避免了创建开销。需要大量相似对象且创建对象代价较高时,如需要频繁创建对象但初始化很复杂的场景。提高对象创建效率,避免复杂的初始化过程。深拷贝与浅拷贝的实现难度较大,且容易引发安全问题。
建造者模式将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。需要创建一个复杂对象,并且该对象由多个部分组成时,如车辆配置、计算机配置等。分步创建复杂对象,关注构建过程,易于扩展。对于简单对象,使用Builder模式可能会显得繁琐。

2、结构型模式对比

模式意图适用场景优点缺点
适配器模式将一个类的接口转换成客户端期望的接口,使得原本不兼容的类可以协同工作。需要复用一些现有的类,但接口与现有系统不兼容时。提高了类的复用性,符合开闭原则,避免修改原有代码。增加了系统的复杂度,可能导致过多的适配器类。
装饰器模式动态地给一个对象增加一些额外的职责。需要在不改变原有对象的情况下,动态地为对象添加功能时,如GUI组件系统。提供了比继承更加灵活的功能扩展方式,符合单一职责和开闭原则。装饰器的层次关系复杂时会增加调试的难度,可能影响程序性能。
代理模式为其他对象提供一个代理,以控制对这个对象的访问。需要为复杂或昂贵的对象提供控制访问的功能时,如远程代理、虚拟代理等。控制对象访问,增加了系统的安全性和灵活性,减少对象的内存消耗和性能开销。增加了系统复杂性,可能影响性能,尤其是当代理链较长时。
外观模式为子系统中的一组接口提供一个一致的接口,外观模式定义了一个高层接口。为复杂的子系统提供简单的接口,减少外部系统对多个子系统的依赖时。提供了一个更简单的接口,隐藏了子系统的复杂性,增强了代码的可读性。外观模式不符合开闭原则,如果子系统发生变化,可能需要修改外观类。
桥接模式将抽象部分与实现部分分离,使它们可以独立变化。需要实现系统的多维度变化,如不同设备的输入方式、不同数据的存储方式。提高了系统的可扩展性,减少了类之间的耦合性,增强了系统的灵活性。增加了系统的复杂性,可能需要开发大量的接口和实现类。

3、行为型模式对比

模式意图适用场景优点缺点
责任链模式将请求的发送者和接受者解耦,使得多个对象有机会处理请求。多个对象可能会处理某个请求时,且实际处理者在运行时确定。请求的发送者和接受者解耦,增强系统的灵活性。责任链过长会影响性能,调试时难以追踪。
命令模式将请求封装为一个对象,使得可以使用不同的请求进行参数化。需要对请求进行排队、记录日志或支持撤销/重做功能时,如事务管理系统。使请求排队、撤销等操作变得灵活,提高了系统的可扩展性。可能会导致命令类过多,增加系统复杂度。
观察者模式定义对象间的依赖关系,当一个对象状态发生改变时,自动通知依赖对象。一个对象的变化会影响其他对象时,如MVC模式中的数据变化通知视图更新。观察者与被观察者之间松耦合,符合开闭原则,增加系统灵活性。通知机制复杂时可能造成性能问题,观察者过多时难以管理。
状态模式允许对象在内部状态发生变化时改变其行为。对象的行为随状态改变而改变时,如游戏中角色的不同状态或商品的生命周期状态。遵循开闭原则,减少了大量的条件判断,增加了状态行为管理的清晰性。状态较多时可能导致状态类膨胀,增加代码维护难度。
策略模式定义一系列算法,允许它们之间可以互换。需要在不同的场景中选择不同的算法时,如支付系统中的不同支付方式。避免了大量的条件判断语句,支持运行时的算法切换,易于扩展。需要客户端了解所有策略以便选择合适的策略,可能增加客户端复杂度。

五 、模式应用场景总结

应用场景推荐模式
需要控制对象的创建工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式
对象间需要复杂的组合关系适配器模式、装饰器模式、代理模式、外观模式、桥接模式
系统中存在复杂行为责任链模式、命令模式、观察者模式、状态模式、策略模式

在项目实践中,根据不同场景选择合适的设计模式,能够提高代码的可维护性、可读性以及灵活性。希望以上表格对比能够帮助开发者在具体应用中快速找到合适的模式。

六、订阅

喜欢的话可以订阅专栏:设计模式入门系列
深入了解每个设计模式如何实现,案例对比、以及使用建议!

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

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

相关文章

数据库的学习

第一章 绪论 基本概念 数据---描述事物的符号 数据库DB---长期存在在计算机内、有组织的、可共享的 大量数据的集合 数据库管理系统DBMS---位于用户和操作系统之间的一层数据管理软件 数据库系统DBS---由数据库、数据库管理系统(及其应用开发工具)、…

VBA技术资料MF201:添加简单的右键菜单

我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套,分为初级、中级、高级三大部分,教程是对VBA的系统讲解&#…

Linux bash特性:

命令别名: 命令行定义命令别名: alias cdt‘cd’ alias 别名‘完整命令’ unlias----删除别名 但是断开连接后,再次链接,命令别名会失效,不同窗口别名也不生效 配置文件内更改命令别名: 在对应用户的…

导入时,Excel模板不被下载

问题描述 提示:这里描述项目中遇到的问题: 这是个SSM项目,以前经常遇到这个问题,今天有幸记录下来 [ERROR][o.a.s.r.StreamResult] Can not find a java.io.InputStream with the name [downLoadFile] in the invocation stack…

【计算机网络篇】计算机网络概述

本文主要介绍计算机网络第一章节的内容,文中的内容是我认为的重点内容,并非所有。参考的教材是谢希仁老师编著的《计算机网络》第8版。跟学视频课为河南科技大学郑瑞娟老师所讲计网。 文章目录 🎯一.计算机网络的组成 ✨主要内容 1.边缘部…

操作系统笔记三

进程 把一个静态程序通过OS在内存中让cpu执行起来的动态执行过程叫进程 写代码都是用户态,而进程在执行过程中需要完成特定的功能,这些功能呢只有操作系统能提供,比如说读写文件,读写文件的过程是与硬盘打交道,这个过程…

106.游戏安全项目-机制插件分析技巧-指针扫描

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于:易道云信息技术研究院 本人写的内容纯属胡编乱造,全都是合成造假,仅仅只是为了娱乐,请不要盲目相信…

【初阶数据结构】详解二叉树 - 树和二叉树(三)(递归的魅力时刻)

文章目录 前言1. 二叉树链式结构的意义2. 手搓一棵二叉树3. 二叉树的遍历(重要)3.1 遍历的规则3.2 先序遍历3.3 中序遍历3.4 后序遍历3.5 遍历的代码实现3.5.1 先序遍历代码实现3.5.2 中序遍历代码实现3.5.3 后序遍历代码实现 4. 统计二叉树结点的个数5.…

Python 函数用法与底层分析

在编写函数时,函数体中的代码写法和我们前面讲述的基本一致,只是对代码实现了封装,并增加了函数调用、传递参数、返回计算结果等内容。 函数简介函数(function)的基本概念 1:一个程序由一个一个的任务组成;函数就是代…

《CUDA编程》1.GPU硬件与CUDA环境搭建

1 GPU 介绍 GPU(graphics processing unit),意为图形处理器,也被称为显卡(graphics card)。GPU的浮点数运算峰值就比同时期的CPU高一个量级;GPU的内存带宽峰值也比同时期的CPU高一个量级。 CP…

【重学 MySQL】三十一、字符串函数

【重学 MySQL】三十一、字符串函数 函数名称用法描述ASCII(S)返回字符串S中的第一个字符的ASCII码值CHAR_LENGTH(s)返回字符串s的字符数,与CHARACTER_LENGTH(s)相同LENGTH(s)返回字符串s的字节数,和字符集有关CONCAT(s1,s2,…,sn)连接s1,s2,…,sn为一个字…

数据加密和数字证书

1 什么是数据加密 数据加密的基本过程就是对原来为明文的文件或数据按某种算法进行处理,使其成为不可读的一段代码,通常称为"密文",使其只能在输入相应的密钥之后才能显示出本来内容,通过这样的途径来达到保护数据不被非法人窃取、阅读的目的。 该过程的逆过程…

【开源免费】基于SpringBoot+Vue.JS服装商城系统(JAVA毕业设计)

本文项目编号 T 046 ,文末自助获取源码 \color{red}{T046,文末自助获取源码} T046,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 新…

数据结构篇--折半查找【详解】

折半查找也叫做二分查找或者对数查找,是一种在有序数组中查找特定元素的查找算法。 折半查找的算法步骤如下: 将目标关键字key与数组中的中间元素比较,若相等则查找成功。key大于中间元素,就到数组中大于中间元素的部分进行查找&…

c++语法(模板初阶+类和对象部分知识点)

1:泛型编程 2:模板 2.1:函数模板 2.2:类模板 3:const成员函数与非const的区别 4:构造函数之初始化列表 4.1:初始化列表语法及其应用 4.2:explicit关键字 5:static成员变量,static成员函数 1:泛型编程 首先在提出泛型编程前我们先来看一下的代码(关于swap函数)。 void swap…

FPGA随记——VIVADO中ASYNC_REG指令

参考文章:Vivado综合属性系列一、ASYNC_REG_asyncregtrue-CSDN博客 -很棒棒的 跨时钟域设计(CDC)是个老生常谈的问题,其场景很多很杂,其中一个比较为人熟知的就是单bit信号从慢时钟到快时钟所采用的两级寄存器处理的…

抖音矩阵系统源码搭建短视频批量剪辑矩阵分发,可开源或oem

打造多语言短视频平台:技术实施方案揭秘 在短视频矩阵系统技术开发实施方案中,数据库设计是基础环节。首先,需要建立语言包数据库表并填充初始文本数据,如英语和中文的常用语。接着,要设计高效的数据库连接和数据访问接…

erlang学习:Linux命令学习3

shell基本输出 创建一个test.sh文件,并开放他的权限,之后向其中编辑以下内容 touch test.sh chmod 777 test.sh vim test.shecho "hello linux"之后运行相应shell程序得到输出 ./test.sh变量 单引号特点: 单引号里的任何字符都…

【Joint Receiver Design for ISAC】Neyman person | Gaussian | MMSE estimator |

【1】统计信号处理 Neyman-Pearson criterion pp 425 【1】 R c E { g x ( n ) x ( n ) H g H } σ 2 I g g H σ 2 I , \mathbf{R}_c\mathbf{E}\{\mathbf{g}x(n)x(n)^H\mathbf{g}^H\}\sigma^2\mathbf{I}\mathbf{g}\mathbf{g}^H\sigma^2\mathbf{I}, Rc​E{gx(n)x(n)HgH}σ2…

sheng的学习笔记-AI-归纳逻辑程序设计(ILP)

AI目录:sheng的学习笔记-AI目录-CSDN博客 规则学习(rule learning): sheng的学习笔记-AI-规则学习(rule learning)-CSDN博客 一阶规则学习: sheng的学习笔记-AI-FOIL(First-Order Inductive Learner)-CSD…