3.4 在开发中使用设计模式

现在,我们应该对设计模式的本质以及它们的组织方式有了初步的认识,并且能够理解ROPES过程在整体设计中的作用。通过之前章节对“体系结构”及其五个视图的探讨,我们打下了坚实的基础。初步了解了UML的基本构建模块后,我们现在可以开始深入学习本书介绍的模式,并探讨如何将它们应用到我们的应用开发工作中。接下来,让我们简要讨论一下如何在日常工作中有效地运用这些设计模式。

首先,我们需要了解模式的适用范围。模式一般适用于以下场景:

  • 解决具有相似问题的设计问题
  • 提高系统的可重用性、可扩展性、可维护性等
  • 提高系统的性能、安全性等

3.4.1 模式孵化:找到正确的模式

当我们面临设计问题时,如何找到解决这个特定问题的模式呢?图3.10给出了本书推荐的多步方法。

1. 熟悉模式

在开始设计之前,你必须熟悉有关模式的各种文献。有许多书籍、文章、网站都讨论了模式在各个领域的应用。本书只介绍了一部分,其他的模式可查参考文献。一旦你掌握了更多的模式词条,特别是和你的应用域密切相关的模式词条,面对设计挑战时,就有了更多智力弹药。

2. 学会思考

“学会思考”是指刻画你面临的设计问题的本质。问题的范围是什么?是做体系结构、某个机制,还是详细设计?最切题的服务质量问题是什么?是性能、可复用性、安全性、可移植性,还是内存使用?将这些按紧要程度分类。有时一旦你做了这一步,本身可能暗示某种设计的解决方案。

3. 模式匹配

模式匹配是指将你的设计问题与已知的模式进行比较,寻找相似之处。这是很好玩的一步。大脑皮层是一架奇妙的模式匹配机,它按学会的思考自动运作处理。这是你在洗澡、睡觉、吃饭时随时都可能体验到“我知道了!”的原因。一旦会用“学会思考”的步骤,你的模式匹配机就有足够的信息下意识地连续运作。

4. 奇迹发生

在设计模式的实践中,“奇迹发生”时刻是一个标志性的转折点。此时,经过一系列的模式匹配努力,我们终于捕捉到了一个潜在的解决策略。这个策略可能并不完美,也许未曾明确地形成通用的解决方案,但它与我们期望的特性紧密相连,为未来的发展和迭代提供了一个有希望的起点。

5. 评估解决方案

你需要评估它是否可行。这包括考虑模式的适用性、解决方案的完整性和可靠性等因素。如果这个解决方案很好,转向步骤6,采用它;如果不好,在澄清以后转向步骤3,甚至转向步骤2。

6. 实例化模式

实例化模式是指将模式的抽象概念转化为具体的设计元素。这包括拆开、合并对象,重新派定协作的职责,或引入新的元素补全等。

7. 测试解决方案

在实例化模式后,你需要测试解决方案是否满足需求。这包括用协作元素再现分析场景,证实它们是否满足功能和行为需求。一旦你满意协作做的事,就可度量所希望的服务质量,如有必要,还需保证这些模式能达到你的服务质量目标。性能和资源利用目标更应如此。

3.4.2 模式挖掘:打磨出自己的模式

创建自己的模式是一种非常有用的设计技巧,尤其是当你对某个特定领域的优化问题有了深刻的体验和理解,对解决方案的一般性质有了足够广泛的理解,足以将它们抽象为泛化的解决方案时。我们把这称为模式挖掘。

模式挖掘并不是多么了不起的发明创造,它只是简单地将在某个上下文中的解决方案与另一个上下文中的解决方案进行比较,找出它们的相似之处,并抽象出这些相似之处。

要想做出一个有用的模式,它必须满足以下条件

  • 它必须能够在不同的上下文中重复使用。
  • 它必须能够为一个或多个服务质量带来有用的改进。

3.4.3 模式实例化:在设计中运用模式

模式实例化是模式挖掘的逆过程。它将模式应用于某个特定的协作,以发挥模式的效益。

模式通常用于对象协作。协作是对象的集合。协作的范围可以很大或很小,小到底层对象,达到子系统和构件。模式实例化的目的是用模式来组织已经存在的协作方案,或者对其进行改进。

在设计中应用或实例化模式,就是定义元素来满足协作中的角色。对于某些模式,可以创建超类来表示角色,然后再使用子类来实例化模式。对于另一些模式,可以使用应用域中的某些元素来替换模式元素,并添加所需的操作和行为。还可以选择性地创建某些对象,就像它们存在于模式中一样。

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

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

相关文章

gem5学习(11):将缓存添加到配置脚本中——Adding cache to the configuration script

目录 一、Creating cache objects 1、Classic caches and Ruby 二、Cache 1、导入SimObject(s) 2、创建L1Cache 3、创建L1Cache子类 4、创建L2Cache 5、L1Cache添加连接函数 6、为L1ICache和L1DCache添加连接函数 7、为L2Cache添加内存侧和CPU侧的连接函数 完整代码…

适用于安防 音响 车载等产品中中的音频接口选型分析

在人工智能兴起之后,安防市场就成为了其全球最大的市场,也是成功落地的最主要场景之一。对于安防应用而言,智慧摄像头、智慧交通、智慧城市等概念的不断涌现,对于芯片产业催生出海量需求。今天,我将为大家梳理GLOBALCH…

自动化测试框架pytest系列之强大的fixture功能,为什么fixture强大?一文拆解它的功能参数。(三)

自动化测试框架pytest系列之基础概念介绍(一)-CSDN博客 自动化测试框架pytest系列之21个命令行参数介绍(二)-CSDN博客 接上两篇文章继续 : 3.3 pytest支持的初始化和清除函数 学过unittest的都知道 ,unittest有四个函数 ,分别是 &#xff…

16.linux计划任务管理

linux计划任务管理 文章目录 linux计划任务管理1. crond计划任务概述2. crond配置文件详解3. crond计划任务管理4. crond配置编写实例5. crond计划任务调试 1. crond计划任务概述 什么是计划任务,计划任务类似于我们平时生活中的闹钟。 在Linux系统的计划任务服务c…

判断是否是json字符串

一、在isJson.js文件里创建一个isJson类并抛出 /*** isJson 类用于判断一个字符串是否为有效的 JSON 字符串。* class isJson* param {string} str - 要判断的字符串。* returns {boolean} 如果字符串是有效的 JSON 字符串,则返回 true;否则返回 false。…

PPT插件-大珩助手-快速构建自己的图形

绘图板-快速构建自己的图形 通过手绘的方式,快速构建自己的想法和创意,通过在PPT中插入绘图,植入背景透明的绘图,点击画笔可切换橡皮擦,可以清空画板重新绘制。 素材库-存储图形 通过素材库存储自己的图形 图形调整…

操作系统期末考复盘

简答题4题*5 20分计算题2题*5 10分综合应用2题*10 20分程序填空1题10 10分 1、简答题(8抽4) 1、在计算机系统上配置OS的目标是什么?作用主要表现在哪个方面? 在计算机系统上配置OS,主要目标是实现:方便性、有…

如何把123转换成字符串的123

在许多编程语言中,将数字123转换为字符串的"123"是非常直接的。以下是几种常见编程语言的示例: Python num 123 str_num str(num) print(str_num) # 输出: 123 JavaScript let num 123; let str_num num.toString(); console…

【WebGIS实例】(12)MapboxGL解决叠加图层的点击事件冒泡

解决方法一: 监听有冲突的图层 map.on(click, layerName, e > {e.preventDefault()console.log(上面的图层)console.log(点击的要素, e.features[0]) })// 下面的那个图层:阻止默认事件,在下面的e可以看到_defaultPrevented: false&#…

three.js 学习笔记(学习中1.10更新) |

文章目录 three.js 学习笔记基础概念透视相机 第一个three.js应用threejs画布尺寸和布局canvas画布宽高度动态变化 坐标辅助器 THREE.AxesHelper实现动画效果requestAnimationFrame时间相关属性和方法 THREE.Clock类 相机控件 轨道控制器OrbitControls 灯光点光源点光源辅助观察…

17.SELinux

SELinux 文章目录 SELinux1、SELinux简介2、SELinux的模式3、管理SELinux上下文4、bool开关 1、SELinux简介 为了保障linux系统的安全,除了firewalld防火墙外,linux系统管理员通常会控制用户和组的权限,这种基于用户和组的安全模型称之为主动…

m1 + swoole(hyperf) + yasd + phpstorm 安装和debug

参考文档 Mac M1安装报错 checking for boost... configure: error: lib boost not found. Try: install boost library Issue #89 swoole/yasd GitHub 1.安装boost库 brew install boostbrew link boost 2.下载yasd git clone https://github.com/swoole/yasd.git 3.编…

Golang 中哪些类型可以作为 map 类型的 key?

目录 可以作为 map 键的类型 不能作为 map 键的类型 最佳实践 小结 在 Go 语言中,map 是一种内置的关联数据结构类型,由一组无序的键值对组成,每个键都是唯一的,并与一个对应的值相关联。本文将详细介绍哪些类型的变量可以作为…

轻量化神奇!看3D模型格式转换工具HOOPS Exchange如何轻松实现减面操作?

现在很多CAD模型都比较复杂,有时候为了一些特殊用途(轻量化显示、布尔运算、CAE网格剖分等),需要到对原始模型进行减面操作。在HOOPS Exchange中,就提供了对模型进行减面操作支持,以下内容就是HOOPS Exchan…

亚信安慧AntDB数据库容灾复制原理

AntDB数据库作为通信运营商领域的杰出的数据服务提供者,一直以来都十分重视数据安全问题,不断通过技术进步、方案创新等方式提升数据容灾能力。在信息化的时代,数据已经成为了重要的资源,对于企业来说,如何存储和管理这…

15.vdo管理

vdo管理 文章目录 vdo管理一、VDO基本概念二、常用操作三、验证VDO卷 一、VDO基本概念 VDO(Virtual Data Optimize虚拟数据优化) 通过压缩或删除存储设备上的数据来优化存储空间。VDO层放置在现有块存储设备例如RAID设备或本地磁盘的顶部。这些块设备也…

docker微服务案例

文章目录 建立简单的springboot项目(boot3)boot2建立通过dockerfile发布微服务部署到docker容器编写Dockerfile打包成镜像运行镜像微服务 建立简单的springboot项目(boot3) 1.建立module 2. 改pom <?xml version"1.0" encoding"UTF-8"?> <…

python爬虫实战(7)--获取it某家热榜

1. 需要的类库 import requests from bs4 import BeautifulSoup import pandas as pd2. 请求榜单 def fetch_ranking_data():url "https://m.xxx.com/rankm/" #某家response requests.get(url)if response.status_code 200:return response.contentelse:print(f…

需要登录的网站爬虫详解

概述 介绍一下请求状态原理分析需要登录的网站请求特点分析登陆前后请求差异如何从接口分析一步步构建一个合理的登录爬虫巧方法解决登录 案例分析 案例一 https://login2.scrape.center/ 默认重定向导致无法获取到重定向前的cookie 案例二爬虫源码 # codingutf-8import …