【系统架构设计师】七、设计模式

7.1 设计模式概述

设计经验在实践者之间日益广泛地利用,描述这些共同问题和解决这些问题的方案就形成了所谓的模式。

7.1.1 设计模式的历史

建筑师Christopher Alexander首先提出了模式概念,他将模式分为了三个部分:

  • 特定的情景(Context):模式在何种情况下发生作用;
  • 动机(System of force):问题或预期的目标;
  • 解决方案(Solution):平衡各动机或解决所阐述问题的一个构造或配置。

模式是表示特定的场景、动机、解决方案三个方面关系的一个规则,每个模式描述了一个在特定情景下不断重复发生的问题,以及该问题解决方案的核心所在。
模式既是一个事物又是一个过程,不仅描述该事物本身,而且提出了通过怎样的过程产生该事物。
设计模式的核心是问题描述和解决方案,问题描述说明模式的最佳使用场合及它将如何解决问题,解决方案是用一组类和对象及其结构动动态协来描述的。

20世纪80年代中期,由Ward Cunningham和Kent Beck将其思想引入到软件领域。1995年,E.Gamma,R.Helm,R.Johnson和J.Vlissides 4人合著了Design Patterns: Elements of Object-Roiented Software(设计模式:可复用面向对象软件的基础)这一经典书籍,这四位大师级人物也被称为Gang Of Four(GoF)。

7.1.2 为什么要使用设计模式

设计模式的应用对软件开发有重大的作用:

  • 简化并加快设计
  • 方面开发人员之间的通信
  • 降低风险
  • 有助于转向面向对象技术

而成熟的软件设计模式:

  • 巧妙:设计模式是在大量实践经验的基础上提炼出来的;
  • 通用:设计模式不依赖特定的系统类型、程序设计语言、应用领域;
  • 得到证明:设计模式在实际系统和面向对象系统中已得到了广泛应用;
  • 简单:设计模式提炼了精简的类设计思想;
  • 可重用:设计模式的建档方式使它们非常易于使用;
  • 面向对象:设计模式是用最基本的面向对象机制构造的,并特定强调区分接口和实现、降低各部分之间的依赖、隔离硬件和软件等面向对象设计的特性。

7.1.3 设计模式的组成元素

  • 模式名
  • 问题或意图
  • 情景
  • 动机
  • 解决方案
  • 示例
  • 结果情景
  • 基本原理
  • 相关模式
  • 已知应用

7.1.4 设计模式的分类

设计模式主要用于得到简洁灵活的系统设计,GoF的书中共有23个设计模式,这个模式可以按两个准则来分类:
一是按设计模式的目的划分:创建型、结构型和行为型三种模式;
二是按设计模式的范围划分(根据设计模式作用于类还是作用于对象):类设计模式和对象设计模式。

  • 创建型模式:对对象实例化过程的抽象,它通过采用抽象类所定义的接口,封装了系统中对象如何创建、组合等信息;
  • 结构型模式:主要用于如何组合已有的类和对象以获取更大的结构,一般借鉴封装、代理、集成等概念将一个或多个类或对象进行组合、封装,以提供统一的外部视图或新的功能。
  • 行为型模式:用于对象之间的职责及其提供的服务的分配,描述对象或类的模式、它们之间的通信模式、及对象间协作完成其单一对象无法单独完成的任务。

7.2 设计模式实例

7.2.1 创建型模式(5种)

1、Abstract Factory(抽象工厂)

为创建一系列相关或者相互依赖的对象提供了一个接口。根据给定的相关抽象类,抽象工程模式提供了一个相匹配的具体子类集创建这些抽象类的实例的方法。

2、Builder(构建器)

构建器模式将复杂对象的构建与其表示相分离,这样相同的构造过程可以创建不同的对象。通过指定对象的类型和内容,构建器模式允许客户端对象构建一个复杂对象。客户端可以不受该对象构造的细节的影响。

3、Factory Method(工厂方法)

工厂方法模式定义了创建对象的接口,它允许子类决定实例化哪个类。它允许将实例化的工作交给其他的子类。

4、Prototype(原型)

原型模式允许对象在不了解要创建对象的确切类以及如何创建等细节的情况下创建自定义对象。原型模式使用动态创建对象更加简单,只要将对象类定义成能够复制自身就可以实现。

5、Singleton(单例)

单例模式确保一个类只有一个实例,并且提供了对该类的全局访问入口,它可以确保使用这个类的实例的所有的对象使用相同的实例。

7.2.2 结构型模式(7种)

1、Adapter(适配器)

适配器模式可以充当两个类之间的媒介,它可以转换一个类的接口被另外一个类使用,使得具有不兼容接口的类能够协同使用。

2、Bridge(桥接)

桥接模式可以将一个复杂的组件分成两个独立的但又相关的继承层次结构:功能性的抽象和内部实现。

3、Composite(组合)

组合模式允许创建树型层次结构来改变复杂性,允许结构中的每一个元素操作同一个接口。

4、Decorator(装饰器)

装饰器模式可以在不修改对象外观和功能的情况下添加或者删除对象功能。

5、Facade(外观)

外观模式为子系统中的一组接口提供了一个统一的接口。这个统一的接口允许对象使用该接口与子系统进行通信,从而实现对子系统的访问。

6、Flyweight(享元)

轻量模式可以通过共享对象减少系统中低等级的、详细的对象数目。

7、Proxy(代理)

代理模式为控制对初始对象的访问提供了一个代理或者占位符对象。它的实现可以有多个类型,如:远程代理和虚拟代理等。

7.2.3 行为模式(11种)

1、Chain of Responsibility(责任链)

责任链模式可以在系统中建立一个链,可以让传递的消息在首先接收到它的级别处理,或者定位到可以处理它的对象。

2、Command(命令)

命令模式在对象中封装了请求,这样可以保存命令,将该命令传递给方法以及像任何其他对象一样返回该命令。

3、Interpreter(解释器)

解释器模式可以解释定义其它语法表示的语言,还提供了用于表示解释语言中的语句解释器。

4、Iterator(迭代器)

迭代器模式为集中的有序访问提供了一致的方法,而该集合是独立于基础集合并与之相分离的。

5、Mediator(中介)

中介模式通过引入一个能够管理对象间消息分布的对象,简化了系统中对象间的通信。该模式可以减少对象之间的相互引用,从而提高了对象间的松耦合度。

6、Memento(备忘录)

备忘录模式可以保持对象状态的“快照”,这样对象可以在不向外界公开其内容的情况下返回到它的最初状态。

7、Observer(观察者)

观察者模式为组件向相关接收方广播消息提供了灵活的方法。该模式定义了对象间一到多的依赖关系,这样当对象改变状态时,将自动通知并更新它所有的依赖对象。

8、State(状态)

状态模式允许对象在内部状态变化时,变更其行为,并修改其类。

9、Strategy(策略)

策略模式定义了一组能够用来表示可能行为集合的类,这些行为可以在应用程序中使用,来修改应用程序功能。

10、Template Method(模板方法)

模板方法模式提供了在不重写方法的前提下允许子类重载部分方法的方法。

11、Vistor(访问者)

访问者模式提供了一种方便的、可维护的方法来表示在对象结构元素上要进行的操作。该模式允许在不改变操作元素的类的前提下定义一个新的操作。

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

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

相关文章

Maven介绍,IDEA集成方式

概述 什么是Maven? Maven 的正确发音是[ˈmevən],Maven在美国是一个口语化的词语,代表专家、内行的意思。 一个对 Maven 比较正式的定义是这么说的: Maven 是一个项目管理工具,它包含了一个项目对象模型 (POM:Proj…

pyav保存视频

目录 imageio替代pyav imageio替代pyav import imageio import numpy as np import torch# 创建一个随机的图像张量,形状为 (N, C, H, W) # 这里 N 30(帧数),C 3(通道数),H 64(…

stl_stack/queue

一.适配器 stack和queue实际上并不能算是一种容器,而是一种容器适配器。而适配器作为stl的6大组件之一,其实是一种设计模式。适配器模式其实就是将一个类的接口(该接口无法直接满足客户的需求)转换成客户希望的另一个接口&#x…

利用Docker Compose构建微服务架构

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 利用Docker Compose构建微服务架构 引言 Docker Compose 简介 安装 Docker Compose 创建项目结构 编写 Dockerfile 前端 Dockerf…

lru_cache用法

在python中,lru_cache是一个装饰器, 是 Python 标准库中 functools 模块的一部分。lru_cache 装饰器可以用来为一个函数添加一个缓存系统。这个缓存系统会存储函数的输入和对应的输出。如果函数被调用,并且给出了已经缓存过的输入&#xff0c…

Redis未授权访问漏洞复现和修复建议

Redis未授权访问漏洞利用(总结) 一、漏洞介绍及危害1.1 原理1.2 漏洞影响版本1.3 漏洞危害1.4 实战中redis常用命令 二、漏洞复现2.1 环境准备2.1.1 靶机安装redis服务器2.1.2 kali安装Redis客户端(Redis-cli) 三、漏洞利用3.1 利…

无人机之集群控制方法篇

无人机的集群控制方法涉及多个技术和策略,以确保多架无人机能够协同、高效地执行任务。以下是一些主要的无人机集群控制方法: 一、编队控制方法 领航-跟随法(Leader-Follower) 通过设定一架无人机作为领航者(长机&am…

流水线商品标签如何快速打印?商品标签自定义打印软件操作方法

一、概述 【软件可定制详情点文章最后信息卡片】 流水线商品标签如何快速打印?商品标签自定义打印软件操作方法 ‌定义与用途‌ 商品标签打印软件,即用于打印商品标签的应用软件。标签包含产品上的文字、商品详情等说明信息 如图,可以预先…

Python - PDF 分割成单页、PDF 转图片(PNG)

文章目录 PDF 分割成一页页的 PDFPDF 转 PNGPDF 分割成一页页的 PDF import fitz def split_pdf(pdf_path, save_dir):source_pdf = fitz.open(pdf_path)# 遍历source_pdf中的每一页,page_number从0开始计数 for idx

不只是任务分配!管理者应具备的核心认知

背景 二十年,中国的互联网行业飞速发展,让无数年轻人有了从技术岗走向管理岗的机会。然而,许多工程师在走上管理岗位时往往是“仓促上任”,没有足够时间适应管理工作和责任。少数悟性高、能力突出的工程师能够迅速胜任&#xff0…

java拷贝应用场景

文件分块上传:允许大文件分块上传,以便于更高效地管理和恢复上传。 文件元数据存储:在数据库中存储文件的元数据(如文件名、大小、上传时间等)。 异步处理:使用异步方法处理文件上传和下载,以提…

第二十五章 Vue父子通信之sync修饰符

目录 一、概述 二、完整代码 2.1. main.js 2.2. App.vue 2.3. BaseDialog.vue 三、运行效果 一、概述 前面的章节我们讲到,通过v-model我们可以实现父子组件间的通信,但是使用v-model的时候,子组件接收的prop属性名必须固定为valu…

【浪潮商城-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 1. 暴力破解密码,造成用户信息泄露 2. 短信盗刷的安全问题,影响业务及导致用户投诉 3. 带来经济损失,尤其是后付费客户,风险巨大,造…

轻松成为文本文件管理大师,将每个文件夹中的所有TXT分别合并成一个文本文档,发现办公软件TXT合并功能的无限可能

文本文件如潮水般涌来,管理它们成为了一项令人头疼的任务。但是,别怕,有了首助编辑高手软件,你将成为办公软件达人,轻松驾驭这些文本文件,体验无限魅力!想象一下,杂乱无章的文件夹瞬…

单例模式四种写法

饿汉式(线程安全) public class Singleton {// 直接创建实例,在类加载时就完成实例化private static final Singleton instance new Singleton();// 私有构造函数private Singleton() {}// 提供公共的静态方法获取实例public static Single…

安卓13默认连接wifi热点 android13默认连接wifi

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改5.编译6.彩蛋1.前言 有时候我们需要让固件里面内置好,相关的wifi的ssid和密码,让固件起来就可以连接wifi,不用在手动操作。 2.问题分析 这个功能,使用普通的安卓代码就可以实现了。 3.代…

青春的海洋:海滨学院班级回忆录项目

3系统分析 3.1可行性分析 通过对本海滨学院班级回忆录实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本海滨学院班级回忆录采用SSM框架,JAVA作为开…

青春海风:海滨学院班级回忆录设计与实现

摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了海滨学院班级回忆录的开发全过程。通过分析海滨学院班级回忆录管理的不足,创建了一个计算机管理海滨学院班级回忆录的方案。文章介绍了海滨学院班级回…

C#中JsonConvert.DeserializeObject方法

JsonConvert.DeserializeObject 是一个在 Newtonsoft.Json 库中用来将 JSON 字符串转换为相应 .NET 对象的方法。 以下是一些使用 JsonConvert.DeserializeObject 的示例: 将 JSON 字符串转换为一个匿名对象: string json "{ Name: John Doe, A…

基于matlab的线性卷积演示系统

文章目录 前言1. 卷积的简单介绍1.1 翻褶1.2 移位1.3 相乘1.4相加1.5 整体的运行效果展示 2.App Designer的介绍3.具体的开发步骤3.1 声明成员变量3.2 设计基本布局3.3 编写回调函数 4.运行展示结语 前言 本篇文章按照如下要求,完成线性卷积演示系统 (1)用matlab完…