3.3 设计模式基础

设计模式的识别:经验丰富的开发者经常会发现,新问题往往与他们之前所遇到的问题存在相似之处,虽然这些问题和解决方案可能各不相同。正是这些问题之间的共性催生了设计模式的概念:将对类似问题解决方案的理解泛化和形式化。

模式孵化与挖掘:

  1. 模式孵化:模式孵化涉及识别问题的本质并在模式库中寻找最佳匹配的解决方案。这一过程不是去创造新的设计模式,而是在已有的设计模式库的基础上进行开发,旨在构建适应特定应用场景的有效方案。
  2. 模式挖掘:模式挖掘是一种识别和记录新模式的过程,包括将问题本质化,创建一个通用解决方案,并理解该解决方案在具体应用场景中的影响和后果。

设计模式的本质:设计模式不仅仅关于软件的重用,它更代表了概念的重用。设计模式提供了一种通用的指导,帮助开发者在特定情况下优化分析模型,包括特定的优化策略和预期效果。

优化的权衡:优化往往涉及在提升系统某些方面性能的同时,牺牲其他方面。例如,一些设计模式可能提高代码的可重用性,但以牺牲最差性能为代价。优化是一个涉及多方面考量的权衡过程,需要在不同的系统属性间进行细致的平衡和抉择。

3.3.1 何为设计模式

设计模式定义:

  1. 通用解决方案:设计模式是对常见问题的通用解决方案,这些问题足够频繁,以至于有必要创建一个普遍适用的模板。
  2. 广泛适用性:设计模式具有广泛的适用性,能够跨越多个应用领域,而不局限于特定类型的软件开发。

设计模式与分析模式的区分:

  1. 特定领域的应用:分析模式针对特定的领域,如金融或航空航天,为该领域内的问题提供解决策略。
  2. 通用性与特定性:设计模式比分析模式更加通用,它们提供更广泛的解决策略,而不是局限于单一领域的问题。

设计模式的特性和目的:

  1. 改进设计:分析是由系统必须做什么来驱动的,而设计则是由系统必须如何达到其要求来驱动的。设计模式意在通过优化特定服务质量特性来改善和提升软件设计。
  2. 权衡与优化:在优化某些服务质量特性的同时,可能需要牺牲其他特性,设计模式就是在这种权衡中寻找最佳解决方案。

设计模式的应用层次: 设计模式可以应用于不同层次的设计抽象。在设计抽象层次中,每层都有其独特的模式类型和应用范围。

  1. 体系结构模式:这本书重点介绍的体系结构模式具有系统级的范围,提供了一种在整个系统层面上解决问题的方法,它们通常解决更广泛、更抽象的问题,如系统如何整体组织、系统各部分如何交互、数据如何流动等。
  2. 机制设计模式(GOF-4)在设计抽象的下一级别,机制设计模式适用于个别的合作关系。与体系结构模式相比,机制设计模式应用的范围更狭窄,通常针对特定的组件或组件之间的交互优化相同的服务质量(QoS)属性。例如,它们可能关注如何优化特定组件的性能、可靠性或可维护性。这些模式帮助设计者优化特定部分的设计,而不是整个系统的体系结构。
  3. 详细设计中的编程风格和最佳实践:在更细致的设计层面,设计模式通常不直接应用,而是更多的是使用编程风格(idioms)和最佳实践(practices)。编程风格特指在特定编程语言中解决特定问题的常见做法,而最佳实践则是广泛认可的、能提升代码质量和可维护性的一般性做法。这些通常关注实现细节,如代码组织、命名约定、编码风格等。

设计模式的类型: 本书介绍的模式主要是结构设计模式。这意味着,这些模式指导如何组织系统或系统的部分,以便可以应用行为策略来优化所需的服务质量(QoS)。结构设计模式的重点在于如何安排和构造系统的结构组件以及它们之间的关系,从而为后续的行为实现和优化提供良好的基础。然而,需要注意的是,并非所有设计模式都必须是结构性的。设计模式的范围远远超出了结构层面,还包括了行为设计模式等其他类型。例如,书籍《Doing Hard Time》[6]提供了一组行为设计模式,这些模式专注于如何“行为性地结构化”状态机,以优化状态机的工作方式。行为设计模式关注的是系统的行为特征,如状态转换、对象间的交互方式、算法的选择等,旨在改进或优化系统的行为特性。

结构设计模式通常关注以下几个方面:

  • 系统组件的组织方式。
  • 组件间的静态关系。
  • 数据流和控制流的结构安排。

行为设计模式则侧重于:

  • 系统的动态行为和交互模式。
  • 对象如何协作完成任务。
  • 状态变化和事件处理。

框架: 为了协同工作而特别定制的一系列相互关联的模式被称为框架。在基于框架的开发工作中,应用程序的大部分都是由实例化的框架提供的。这包括应用程序的核心内容,提供构建GUI元素、管理设备、处理并发、执行状态机等服务。开发者只需要构建系统的特有元素,其余全部依赖框架支持这个应用服务。

框架提供四种主要的使用策略:实例化、泛化、参数化和扩展,许多框架都使用这四种策略。

  • 实例化:实例化策略时可以直接使用框架的某些方面,例如调度线程或执行状态机。
  • 泛化:泛化策略采用框架的一个抽象元素并专门化它,添加新功能。例如,实时框架可能提供一个符合模型-视图-控制器(Model-View-Controller)风格模式的Sensor类,我们可以为特定设备子类化这个Sensor类并重写继承的方法。这是使用模式的非常常见的方式。
  • 参数化:当框架提供参数化类时,例如在使用C++ STL容器时,你需要在实例化时提供实际的参数。
  • 扩展:大多数框架都有特殊的地方,你可以插入部件来扩展框架。例如,插入一个CAN总线通信协议或一个HDLC(高级数据链路通信)协议。

框架的缺点是它们限制了你做事情的方式,而且框架比应用程序更难以设计和构建,尽管它们极大地简化了应用程序开发。尽管如此,框架是有效使用模式的典型示例,它们通过一套协同工作的模式提供了一个强大、灵活而且经过验证的解决方案的基础架构,使得开发者能够更加专注于应用程序的特定功能和业务逻辑。

3.3.2 设计模式的基本结构

根据Gamma等人的定义,一个设计模式主要包含以下四个重要方面:

  • 名称

    • 名称为设计模式提供了一个“Handle”,便于引用和讨论模式。
    • 通过命名,我们能够以明确、无歧义的方式引用模式,并用更抽象的词汇描述我们的设计结构。
  • 目的

    • 目的描述了模式旨在优化的问题上下文和服务质量(QoS)方面。
    • 它指明了模式适用的特定问题上下文,并明确了适用和非适用的情况。
  • 解决方案

    • 解决方案即是模式本身,包含了模式中元素的定义及其相互作用。
    • 接下来,我们将看到如何通过替换或继承这些元素,将模式具体实例化到应用中。
  • 后果

    • 后果指出了采用模式的优点与缺点。
    • 在选择一个模式时,我们需要进行权衡,并充分理解模式的优劣,以便有效应用。通常,这些优劣会以服务质量的改善或退化来表述,同时提供适用的问题上下文。

3.3.3 如何阅读本书设计模式

本节详细介绍了如何阅读本书中的设计模式。所有模式都采用统一的组织方式,以提升其可用性。主要内容包括:

  • 摘要(Abstract):

    • 提供模式使用或其合理性的简要描述,旨在概述问题、解决方案和后果。
  • 问题(Problem):

    • 阐述了模式所解决的问题背景及涉及的服务质量。
  • 模式结构(Pattern Structure):

    • 展示了模式的结构性UML图,揭示了模式的重要元素及其相互关系。这些元素是你将替换为特定应用元素以实例化模式的部分。
  • 协作角色(Collaboration Roles):

    • 对模式协作中各个元素的属性进行了详细描述。
  • 后果(Consequences):

    • 描述了采用模式时的权衡。
  • 实现策略(Implementation Strategies):

    • 讨论了在不同计算平台或不同源级语言中实现模式的各种问题。
  • 相关模式(Related Patterns):

    • 引用书中的其他模式,这些模式可能用于替换当前模式(当然,基于不同的优化标准)或经常与当前模式结合使用。
  • 示例模型(Example Model):

    • 展示了模式在具体案例中的应用示例。通常包括展示一个UML结构图,显示特定应用元素如何充当模式协作角色,以及一个序列图,展示协作执行的路径。

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

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

相关文章

17. 从零用Rust编写正反向代理, Rust中一些功能的实现

wmproxy wmproxy是由Rust编写,已实现http/https代理,socks5代理, 反向代理,静态文件服务器,内网穿透,配置热更新等, 后续将实现websocket代理等,同时会将实现过程分享出来&#xff…

vite前端工具链,为开发提供极速响应

一、概念 Vite是一个高性能的分布式智能合约平台。它使用了一种名为“异步架构”的设计,能够支持高吞吐量和低延迟的交易处理。Vite采用了基于DAG(有向无环图)的账本结构,可以实现并行处理多个交易,并且具有快速确认的…

【Golang】十六进制字符串转二进制字符串

使用Go语言将十六进制转换为二进制 在计算机科学中,我们经常需要在不同进制的数字之间进行转换。Go语言提供了一系列的标准库来方便我们进行这些进制转换。本文将介绍如何使用Go语言将十六进制字符串转换为二进制字符串。 函数概述 首先,我们定义一个…

[Oracle][详细] Win完全卸载Oracle

前提准备 进入服务 找到Oracle开头的服务 将这些服务全部停止 Top 1 点击开始菜单找到Oracle,然后点击Oracle安装产品,再点击【Universal Installer】 Top 2 点击之后稍等一会然后会进入进入下图界面,点击卸载产品 Top 3 选中要删除的Oracle产品,然后点击【删除】 Top 4 进…

性能监控软件选择攻略

随着企业对应用程序性能的关注度不断增加,选择适当的性能监控软件变得至关重要。性能监控软件能够帮助企业实时追踪应用程序的性能指标,识别潜在问题并提高系统的稳定性。在选择性能监控软件时,以下攻略将有助于确保您的选择符合业务需求并能…

SpringIOC之support模块GenericApplicationContext

博主介绍:✌全网粉丝5W+,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验✌ 博主作品:《Java项目案例》主要基于SpringBoot+MyBatis/MyBatis-plus+…

鸿蒙开发笔记(一):ArkTS概述及声明式UI的使用

ArkTS是HarmonyOS优选的主力应用开发语言。ArkTS围绕应用开发在TypeScript(简称TS)生态基础上做了进一步扩展,继承了TS的所有特性,是TS的超集。 ArkTS在TS的基础上主要扩展了如下能力: 基本语法:ArkTS定义…

Docker实战06|深入剖析Docker Run命令

前几篇文章中,重点讲解了Linux Namespace、Cgroups、AUFS的核心原理,同样也是Docker的底层原理实现。目录如下: • 《Docker实战01|容器与开发语言》 • 《Docker实战02|Namespace》 • 《Docker实战03|C…

软件测试公式之如何高质量的做BUG分析?

对于BUG分析,测试人员再熟悉不过了。但如果是面对大量的BUG,要如何有效的分析呢?有什么好的方案和行动项?今天聊聊这个话题。 01 BUG分析简单可以分为两类:宏观BUG分析 和 微观BUG分析。 宏观BUG分析:在…

响应式Web开发项目教程(HTML5+CSS3+Bootstrap)第2版 例3-5 CSS3 动画

代码 <!doctype html> <html> <head> <meta charset"utf-8"> <title>CSS3 动画</title> <style> .img {width: 150px; } keyframes rotate { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg);} } img…

【C++】入门与过渡

【C】入门与过渡 文章目录 【C】入门与过渡一、命名空间二、输入输出(cin/cout)三、缺省参数四、函数重载五、引用作用使用注指针和引用的区别 六、内联函数七、auto关键字八、空指针 注&#xff1a;本文为学习笔记&#xff0c;只记录了一些重点&#xff0c;有些比较简单的内容…

使用boost.hana在编译期加密字符串

在当今数字时代&#xff0c;软件安全问题愈发凸显&#xff0c;攻击者利用各种手段对应用程序进行破解和逆向工程的尝试也日益猖獗。其中&#xff0c;通过使用OllyDbg、IDA等软件加载应用程序&#xff0c;分析程序中的字符串&#xff0c;进而找到关键条件判断&#xff0c;实施软…

【python】进阶--->MySQL数据库(一)

一、mysql数据库 关系型数据库 &#xff1a; 一些相关的表和其他数据库对象的集合。 表是由行和列组成。列包含一组命名的属性(也称为字段)。 行包含一组记录&#xff0c;行和列的交集称为数据项(也叫字段值)。 数据库(database) : 存储数据的仓库&#xff0c;本质上就是一个文…

《C++ Primer》第14章 重载运算与类型转换(二)

参考资料&#xff1a; 《C Primer》第5版《C Primer 习题集》第5版 14.8 函数调用运算符&#xff08;P506&#xff09; 如果类重载了函数调用运算符&#xff0c;则我们可以像使用函数一样使用该类的对象。这样的类同时也能存储状态&#xff0c;所以它们比普通函数更加灵活。…

x-cmd pkg | czg - git commit 智能生成工具

目录 简介首次用户功能特点竞品和相关作品进一步探索 简介 czg 源于 commitizen/cz-cli 交互插件中 cz-git 的延伸项目&#xff0c;重新使用 TypeScript 编写的零依赖独立的 Node.js 命令行工具。旨在使用交互友好的方式&#xff0c;辅助用户生成规范的 git commit message 约…

游泳耳机哪种款式好?最值得入手的游泳耳机大全

在如今注重健康和娱乐的生活方式中&#xff0c;游泳作为一项全身性的运动备受欢迎。然而&#xff0c;对于热爱水中活动的人们来说&#xff0c;选择一款出色的游泳耳机至关重要。好的游泳耳机不仅能提供清晰的音质&#xff0c;还能有效防水&#xff0c;让您在水中尽情畅游的同时…

MySQL中约束是什么?

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;重拾MySQL &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出现错误&am…

记录由客户端http请求原因引起的5xx响应问题排查过程

看到 http 状态码 5xx&#xff0c;很多开发者第一感觉就是服务端的问题&#xff0c;其实并不全是。下面我遇到的问题就是一个例外。 问题描述 最近在为反向代理 nginx 配置 auth_request 后&#xff0c;出现了请求504错误。 504状态码是HTTP协议中的一种服务器错误状态码。当…

Windows压缩包的MySQL安装方式

1.下载压缩包 https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.35-winx64.zip 2.解压压缩包&#xff08;建议将解压到非C盘&#xff0c;路径不要出现特殊符号&#xff09; 3.在MySQL主目录下&#xff0c;创建my.ini空文件&#xff08;先创建一个txt文件&#xff0c;进…

如何改造现有文件为 CMD 模块

如何改造现有文件为 CMD 模块 经过一段考察&#xff0c;我们终于要在项目中引入模块机制和 Sea.js 了&#xff0c;那么如何将现有的文件改造成 CMD 模块就成了重要的问题。下面针对一些典型场景来说明包装的方式。 首先还是请大家详细了解下 CMD 模块定义规范&#xff0c;只要…