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

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

文章目录

  • 一、了解六大设计原则
  • 二、 掌握六个类与类之间的关系
  • 三、设计模式的分类
  • 四、 设计模式详解与对比
    • 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.xdnf.cn/news/1542408.html

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

相关文章

【算法】BFS系列之 拓扑排序

【ps】本篇有 3 道 leetcode OJ。 目录 一、算法简介 二、相关例题 1)课程表 .1- 题目解析 .2- 代码编写 2)课程表 II .1- 题目解析 .2- 代码编写 3)火星词典 .1- 题目解析 .2- 代码编写 一、算法简介 【补】图的基本概念 &#…

HTML翻牌器:用CSS和HTML元素创造动态数字展示

HTML翻牌器:用CSS和HTML元素创造动态数字展示 前言 翻牌器是一种数字动态展示形式,在生活中常见的例如翻牌计分、翻牌时钟等。 之所以以翻牌的形式是因为其物理设计的原因使其只能滚动翻牌展示数字,在电子显示设备不普及时,使用…

Leetcode - 139双周赛

目录 一,3285. 找到稳定山的下标 二,3286. 穿越网格图的安全路径 三,3287. 求出数组中最大序列值 四,3288. 最长上升路径的长度 一,3285. 找到稳定山的下标 本题就是找[0, n-2]中,height[i]…

C++入门12——详解多态2

上篇文章(C入门12——详解多态1)中,我们介绍了C多态的概念和用法,但是只知其然而不知其所以然是万万不行的,所以本篇文章将从探案的角度详细介绍多态的原理。 1. 虚函数表 想要弄懂多态的原理,首先要了解一…

数据结构与算法学习day22-回溯算法-分割回文串、复原IP地址、子集

一、分割回文串 1.题目 131. 分割回文串 - 力扣(LeetCode) 2.思路 分割回文串可以抽象为一棵树形结构。 递归用来纵向遍历,for循环用来横向遍历,切割线(就是图中的红线)切割到字符串的结尾位置&#xf…

STM32F407单片机编程入门(十三) 单片机IAP(在应用编程)详解及实战源码

文章目录 一.概要二.STM32F407VET6单片机IAP介绍1.STM32F407VET6单片机IAP基本原理2.STM32F407VET6单片机IAP基本流程 三.配置一个BOOT工程四.配置一个APP工程五.工程源代码下载六.小结 一.概要 STM32单片机程序升级方法有很多种,主要有以下几种: 1.将…

【LeetCode】146. LRU缓存

1.题目 2.思想 3.代码 3.1 代码1 下面这是一版错误的代码。错误的原因在于逻辑不正确导致最后的代码也是不正确的。 class LRUCache:def __init__(self, capacity: int):self.time 0 # 用于全局记录访问的时间self.num2time {} # 数字到时间的映射self.key2val {} # 数字…

如何理解MVCC

MVCC是什么? MVCC,是MultiVersion Concurrency Control的缩写,翻译成中文就是多版本并发控制,多个事务同时访问同一数据时,调控每一个事务获取到数据的具体版本。和数据库锁一样,它也是一种并发控制的解决…

实时同步 解决存储问题 sersync

目录 1.sersync服务 2.sersync同步整体架构 ​编辑 3.rsync服务准备 4.sersync部署使用 5.修改配置文件 6.启动sersync 7.接入nfs服务 8.联调测试 1.sersync服务 sersync服务其实就是由两个服务组成一个是inotify服务和rsync服务组成 inotify服务用来监控那个…

Infineon——TC397 Multicore简介

文章目录 前言一、TC397简介二、命名规则三、多核开发建议 前言 AURIX™ TC3xx微控制器架构具有多达6个独立的处理器内核CPU0…CPU5, 可在一个统一平台上无缝托管多个应用程序和操作系统. 由于实现了具有独立读取接口的多个程序Flash模块, 该架构支持进一步的实时处理. AURIX™…

自学笔记之TVM编译器框架 ,核心特性,模型优化概述,AI应用落地

最近在学习一些和芯片 AI相关的知识,重点了解了一下TVM,我自己认为TVM在AI应用落地类似的项目中,用途还是非常广泛的,现在把一些重要的笔记贴在下面,有两篇原帖链接也附上,感兴趣的同学可以学习一下。 TVM…

小球轻重的测量

设有12个小球。其中11个小球的重量相同,称为好球;有一个小球的重量与11个好球的重量不同(或轻或重),称这个小球为坏球。试编写一个算法,用一个无砝码的天平称三次找出这个坏球,并确定其比好球轻…

SpringCloud入门(五)Nacos注册中心(上)

国内公司一般都推崇阿里巴巴的技术,比如注册中心,SpringCloudAlibaba也推出了一个名为Nacos的注册中心。Dynami Naming and Configuration Service。是阿里巴巴2018年7月开源的项目。 Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件。…

智谱清影 - CogVideoX-2b-部署与使用

🍑个人主页:Jupiter. 🚀 所属专栏:Linux从入门到进阶 欢迎大家点赞收藏评论😊 目录 体验地址:[丹摩DAMODEL官网](https://www.damodel.com/console/overview) CogVideoX 简介本篇将详细介绍使用丹摩服务器部…

网络通信——OSI七层模型和TCP/IP模型

OSI模型 一.OSI七层模型 OSI(Open System Interconnect)七层模型是一种将计算机网络通信协议划分为七个不同层次的标准化框架。每一层都负责不同的功能,从物理连接到应用程序的处理。这种模型有助于不同的系统之间进行通信时,更…

KamaCoder 103. 水流问题

题目要求 N*M的矩阵,数值代表位置的相对高度。矩阵模拟了一个地形,当雨水落上时,会根据地形倾斜向低处流动。但是只能从较高或等高的地点流向较低或等高并且相邻的地点,我们的目标是确定那些单元格,从这些单元格出发的…

Vue(14)——组合式API①

setup 特点&#xff1a;执行实际比beforeCreate还要早&#xff0c;并且获取不到this <script> export default{setup(){console.log(setup函数);},beforeCreate(){console.log(beforeCreate函数);} } </script> 在setup函数中提供的数据和方法&#xff0c;想要在…

101. 对称二叉树(共含三道leetcode题)

文章目录 101. 对称二叉树递归法迭代法 小结100.相同的树572.另一个树的子树 101. 对称二叉树 101. 对称二叉树 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true示例 2&#…

Administration Console后台弱⼝令登录

1.环境搭建 cd vulhub-master/iboss/CVE-2017-12149 docker-compose up-d 2.访问登录页面 JBoss AS 6 Admin Consolehttp://47.121.211.205:8080/admin-console/login.seam?conversationId4用户名admin 密码vulhub 3.上传war文件 4.访问上传文件并进行连接 访问上传文件 使…

kubectl 执行一条命令之后发生了什么?

kubectl 是与 Kubernetes 集群交互的命令行工具&#xff0c;用户通过它可以对集群资源进行操作和管理。你有没有想过&#xff0c;当我们执行一条 kubectl 命令之后&#xff0c;背后都发生了什么&#xff1f; 详细过程 kubectl -> kube-api-server 根据通信类型&#xff0…