设计模式: 23重设计模式

news2024/11/27 10:39:30

设计模式

    • 设计模式概述
    • 设计模式的概念
    • 设计模式的组成
    • 23种设计模式
    • 设计模式与软件架构
    • 设计模式分类
        • 创建型设计模式
        • 结构型设计模式
        • 行为型设计模式

设计模式概述

在20世纪70年代,Christopher Alexander 提出了城市建筑的模式,他认为:模式是描述一个不断发生的问题和该问题的解决方案。随后,Erich Gamma,Richard Helm,Ralph Johnson 和John Vlissides 写了一本著名的参考书《设计模式:可复用面向对象软件的基础》,后人也因为这本书称四人为四人组,将这本书中描述的模式称为GoF(Gang of Four)设计模式。在这本书中,四人组将设计模式定义为:对被用来在特定场景下解决一般设计问题的类和互相通信的对象的描述。通俗的说,可以把设计模式理解为对某一类问题的通用解决方案。

设计模式的概念

首先,设计模式解决的是一类问题,例如工厂模式就是为了解决类的创建的问题,而适配器模式则是为了解决类接口不匹配的问题。如果把解决A问题的设计模式用于B问题,结果肯定张冠李戴。所以在描述设计模式前,首先要描述这个设计模式究竟要研究什么样的问题。
其次,设计模式是一种通用的解决方案,而不是具体的。也不是唯一的。在GoF的书中对设计的描述着重于思想的描述,虽然也给出了C++的实现方法。但同样也可以用Java甚至面向对象的语言实现。具体应用时可以根据实际情况进行相应的变化。

设计模式的组成

一般的,在描述一个设计模式时,至少需要包含四个方面:模式名(Pattern name),问题(problem),解决方案(solution),效果(consequence)。这四个方面是设计模式的四要素。名不正言不顺,每种设计模式都有自己的名字,也就是模式名;设计模式都有其应用的场合,即该设计模式意图解决的问题,超出了这个问题就不应该再应用这种模式,所以问题是设计模式的第二要素;设计模式的目的既是解决问题,所以在描述设计模式时当然要有解决问题的方法描述,这就是设计模式的另一要素–解决方案;对于每一种设计模式而言,还有其更具体的效果描述,所以设计模式的最后一个要素就是效果。

23种设计模式

  1. Factory Method 模式(工厂模式)。Factory Method模式提供了一种延迟创建类的方法,使用这个方法可以在运行期由子类决定创建哪一种类的实例。
  2. Abstract Factory模式。Abstract Factory又称为工厂模式,该模式主要为解决复杂系统中对象创建的问题。抽象工厂模式提供了一个一致的对象创建接口来创建一系列具有相似基类或相似接口的对象。
  3. Builder模式(建造者模式)。Builder模式与Abstruct Factory模式非常类似,但是Builder模式是逐步的构造出一个复杂对象。并在最后返回对象的实例。Builder模式可以把复杂对象的创建与表示分离。
  4. Prototype模式(原型模式)。Prototype模式可以根据原型实例制定创建的对象的种类,并通过深复制这个原型来创建新的对象。Prototype模式有着同Abstract Factory模式和Builder模式相同的效果。不过当小实例化的类是运行期才被指定的而且要避免创建一个与产品曾是平行的工厂类层次时,可以使用Prototype模式,使用Prototype模式可以在运行时增加或减少原型,比Abstract Fac和Builder模式更加灵活。
  5. Singleton模式(单例模式)。Singleton模式也是一种很有代表性的模式,使用Singleton模式可以保证一个类仅有一个实例。从而可以提供一个单一的全局访问点。
  6. Adapter模式(适配器模式)。Adapter模式而言解决系统间接口不相容的问题,通过Adapter可以把类的接口转化为客户程序所希望的接口,从而提高复用性。
  7. Bridge模式(桥接模式)。Bridge模式把类的抽象部分和实现部分分离,这样类的抽象和实现都可以独立变化。
  8. Composite模式(组合模式)。composite模式提供了一种以树形结构组合对象的方法。使用Composite可以使单个对象和组合后的对象具有一致性,以提高软件的复用性。
  9. Decorator模式(装饰器模式)。Decorator模式可以动态的为对象的某一种方法增加更多的功能呢,在很多时候,使用Decorator模式可以不必继承出新的子类从而维护简介的类继承结构。
  10. Facade模式 (外观模式)。Facade模式为一组类提供了一致的访问接口。使用Facade可以封装nebula具有不同接口的类。是其对外提供统一的访问接口。
  11. Flyweight模式(享元模式)。Flyweight模式可以共享大量的细粒度对象。从而节省创建对象所需要分配的空间。不过在时间上的开销会变大。
  12. Proxy模式(代理模式)。顾名思义,Proxy模式为对象提供了一种访问代理。通过对象Proxy可以控制客户程序的访问。例如:访问权限的控制,访问地址的控制,访问方式的控制等。甚至可以通过Proxy将开销较大的访问化整为零,提高访问效率。
  13. Interpreter模式(解释器模式)。定义了一个解释器。来解释遵循给定语言和文法的句子。
  14. Template Method模式(模板方法模式)。定义一个操作的模板,其中的一些步骤会在子类中实现,以适应不同的情况。
  15. Chain of Responsibility模式(责任链模式)。Chain of Responsibility模式把可以相应请求的对象组织成一条链。并在这条对象链上传递请求。从而保证多个对象都有机会处理请求而且可以避免请求方和响应方的耦合。
  16. Command模式(命令模式)。将请求封装为对象。从而增强请求的能力。如参数化,排队,记录日志等。
  17. Iterator模式。Iterator模式提供了顺序访问一个对象集合中各元素的方法,使用Iterator可以避免暴露集合中对象的耦合关系。
  18. Mediator模式(中介者)。Mediator模式可以减少系统中对象间的耦合性。Mediator模式使用中介对象封装其他对象。从而使这些被封装的对象间的关系称为松耦合。
  19. Memento模式(备忘录模式)。Memento模式提供了一种捕获对象状态的方法。而且不会破坏对象的封装。并且可以在对象外部保存对象的状态。并在需要的时候回复对象状态。
  20. Observer模式(观察者模式)。Observer模式提供了将对象的状态广播到一组观察者的方式。从而可以让每个观察者随时可以得到对象更新的通知。
  21. State模式(状态模式)。State模式允许一个对象在其内部状态改变的时候改变他的行为。
  22. Strategy模式(策略模式)。使用Strategy模式可以让对象中算法的变化独立于客户。
  23. Visitor模式(访问者模式)。表示对某对象结构中各元素的操作。使用Visitor模式可以在不改变各元素类的前提下定义作用于这些元素的新操作。

设计模式与软件架构

很多时候大家说起架构就提设计模式,说设计模式就说架构师。搞得玄之又玄的。一些混子挂着架构师的名头,其实只是把前人留下的架构搞熟悉了,再熟悉业务流程,就招摇撞骗了,很多基础的东西都不懂,为什么这么设计懂,为什么选这个结构不懂,架构有没有问题不懂(提到这里,就忍不住吐槽以前遇到的一些混子)。
这里直接说一下架构和设计模式的区别。软件架构描述的是软件的组成。如果做架构设计,如何描述架构。会用到例如经典的“4+1”视图,将软件架构通过逻辑视图,开发视图,进程视图,物理视图和场景视图来进行面so。在这些视图中,描述软件系统中类之间的关系,进程之间的关键,软件和硬件的结合等问题。一般来说软件架构更倾向于从整体和全局上描述软件的组成。
而设计模式则更侧重于类与类,对象与对象之间的关系。例如逻辑视图中,可以使用多种设计模式来组织类与类之间的关系。因此,设计模式和软件架构是面向不同层次问题的解决方案。
同设计模式一样,软件架构也有一些固定的模式,通常称为架构风格。常见的架构风格有分层架构,客户端-服务器架构,消息总线,面向服务的架构(SOA)等。
软件架构风格同设计模式在某种含义上市一致的。设计模式和软件架构中蕴含的很多思想是一致的。无论是架构风格还是设计模式,人们在追求良好设计的过程中,将一些常见解决方案总结,整理出来,形成固定的风格与模式。例如消息总线的架构风格同Observer模式就有相似之处。因此,掌握设计模式对于软件架构设计有很大的帮助。但是只懂设计模式。并不一定能做好架构。

设计模式分类

设计模式是面向问题的,每一种设计模式都是为了解决一种特定类型的问题。因此,根据设计模式要解决的问题,将设计模式分为三类。分别为 创建型,结构型,和行为型
事实上,面向对象的设计中,需要解决的就是:如何管理系统中的对象,如何组织系统中的类与对象,系统中类与对象如何相互通信。这三类设计模式分别解决了这三个方面的问题。

创建型设计模式

主要解决对象的创建的问题,在最简单的情况下,在程序中定义 类,在使用时创建一个对象实例。但在实际开发中,对象的创建会变得复杂很多,这时候需要使用创建型设计模式解决创建对象的问题。

结构型设计模式

随着开发系统的不断扩张,系统功能更加丰富,墨迹间的附庸越来越多,系统中类与对象的结构变得更加复杂。如果缺乏良好的设计,这些类之间的额关系将会变得非常混乱。结构型设计模式就是为了解决这些问题的。

行为型设计模式

,行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。

在这里插入图片描述

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

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

相关文章

Windows的内部结构API

Windows内部结构 由于 Windows 机器构成了企业基础设施的大部分,红队需要了解 Windows 的内部结构以及如何(滥用)使用它们。在制作攻击性工具或漏洞利用时,红队可以滥用这些来帮助规避和利用。 进程 进程维护并代表程序的执行&…

Abaqus 中的步进、增量、迭代和尝试概念 硕迪科技

Abaqus 中的步进、增量、迭代和尝试等可能会在概念上让 Abaqus 初学者感到困惑。清楚地了解分析步骤、荷载增量和迭代之间的区别非常重要。在这篇文章中快速了解 Abaqus 步骤和增量迭代。 在ABAQUS中,步进增量迭代是解决非线性问题的一种数值计算方法。这种方法通常…

【分布式】1、CAP 理论 | 一致性、可用性、分区容忍性

文章目录 一、CAP 理论1.1 Consistency 一致性1.2 Availbility 可用性1.3 Partition Tolerance 分区容忍性1.4 CAP 应用1.4.1 CP1.4.2 AP 二、CAP 实践2.1 ACID2.2 BASE 一、CAP 理论 是 2002 年证明的定理,原文,内容如下: In a distributed…

Day52: 84.柱状图中最大的矩形

84.柱状图中最大的矩形 84. 柱状图中最大的矩形 - 力扣(LeetCode) 思路 本题是要找每个柱子左右两边第一个小于该柱子的柱子,所以从栈头(元素从栈头弹出)到栈底的顺序是从大到小的顺序。例: 三种情况&a…

安装 VNC 服务器-iTOPRK3588开发板

开发板联网以后,在串口终端输入以下命令: sudo apt-get update sudo apt-get upgrade sudo apt-get install tightvncserver apt-get install xfonts-base 安装完毕之后,在串口终端输入以下命令运行 vnc tightvncserver 然后要求设置密…

算法专题:投票法

文章目录 169.多数元素(找频率>n/2,且多数元素一定存在)思路完整版补充:注意点 面试题 17.10. 主要元素(找频率>n/2,但多数元素不一定存在)思路完整版 229.多数元素Ⅱ(找频率&…

“智能文件批量改名工具:轻松去除文件名中的特殊符号“

您是否曾经为繁杂的文件命名而感到困扰?特殊符号导致文件名混乱难辨,给您的工作和学习带来不便?现在,我们的智能文件批量改名工具为您解决这一难题! 首先,我们要进行文件批量改名高手主页面,并…

基于Docker容器安装TensorFlow测试GPU

前言 当基于nvidia gpu开发的docker镜像在实际部署时,需要先安装nvidia docker。安装nvidia docker前需要先安装原生docker compose 1. CentOS7安装docker详细教程 安装docker 1. Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验…

【iOS】CALayer的理解与简单使用

文章目录 前言一、UIView与CALayer的关系二、CALayer的简单使用1.圆角与裁剪2.contents3.边框属性 总结 前言 在实现网易云音乐demo开发的过程中,通过查阅网上资料,发现了我们可以对我们的视图进行裁剪来实现美观的体现,例如这样&#xff1a…

支付宝原生小程序组件与父级传递数据(微信小程序基本一样)

1. 声明组件 在对应的目录下,右击点击 新建小程序,之后会生成对应的文件 2. 子组件 Component({data: {colorList: [#165FF6, #3D16F6,

【C++杂货铺】拷贝构造函数

📖定义 拷贝构造函数是构造函数的一个重载,它的本质还是构造函数,那就意味着,只有在创建对象的时候,编译器才会自动调用它,那他和普通的构造函数有什么区别呢? 拷贝构造函数,是创建…

Ubuntu系统开发环境搭建和常用软件

目录 安装PHP7.3 安装MySQL5.7 安装Nginx 配置Nginx支持PHP 安装Jetbrains全家桶 将程序加入到桌面和收藏夹 安装Navicat15 安装 redis和客户端工具 截图工具 终端修改 其它软件 当前我的系统是Ubuntu22.04: 安装PHP7.3 如果使用 apt install php 默认应…

一文讲透 Redis 事务 (事务模式 VS Lua 脚本)

准确的讲,Redis 事务包含两种模式 : 事务模式 和 Lua 脚本。 先说结论: Redis 的事务模式具备如下特点: 保证隔离性; 无法保证持久性; 具备了一定的原子性,但不支持回滚; 一致性的概念有分歧…

BI-SQL丨XML PATH

XML PATH 在SQL Server中,XML数据类型的应用范围是非常宽泛的,除了可以使用value和nodes处理一行拆多行的情况,我们还可以使用PATH处理多行合并成一行。 使用实例 例子:使用PATH处理多行合并成一行。 创建一张表,表…

在vsCode 中执行Electron 项目时,出现中文乱码问题

问题:vscode 中执行Electron 项目时,控制台出现乱码 解决方法: 在 terminal 修改编码格式:65001代表UTF-8,936代表GBK

freeswitch的mod_xml_cdr模块

概述 freeswitch是一款简单好用的VOIP开源软交换平台。 在语音呼叫的过程中,话单是重要的计价和结算依据,话单的产生需要稳定可靠,可回溯。 fs中的mod_xml_cdr模块提供了基本话单功能之外的选择,可以输出XML格式的本地话单或通…

arm day4

.text .global _start _start: /**********LED1点灯**************/bl rcc_initbl led_initbl led1_initbl led2_initloop:bl led_onbl delay_1sbl led_offbl delay_1sbl led1_onbl delay_1sbl led1_offbl delay_1sbl led2_onbl delay_1sbl led2_offbl delay_1sb looprcc_init…

数据结构和算法——快速排序(算法概述、选主元、子集划分、小规模数据的处理、算法实现)

目录 算法概述 图示 伪代码 选主元 子集划分 小规模数据的处理 算法实现 算法概述 图示 快速排序和归并排序有一些相似,都是用到了分而治之的思想: 伪代码 通过初步的认识,我们能够知道快速排序算法最好的情况应该是: 每…

前端 | ( 九)尚品汇实操练习 | 尚硅谷前端html+css零基础教程2023最新

学习来源:尚硅谷前端htmlcss零基础教程,2023最新前端开发html5css3视频 文章目录 📚顶部导航条📚头部📚主导航📚内容区_侧边导航📚内容区_侧边二级菜单⭐️📚内容区_右侧尚品快报&am…

docker安装mysql8.0+

文章目录 1.docker仓库找到需要的镜像版本2.安装Mysql镜像3.创建mysql配置文件4.创建mysql容器并运行5.建立软连接6.开放3306端口7.登录mysql8.修改mysql密码9.查看mysql日志10.重启mysql10.外部如何访问mysql 1.docker仓库找到需要的镜像版本 镜像仓库 2.安装Mysql镜像 找到所…