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 模式实例化:在设计中运用模式

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Qt优秀开源项目之二十一:遇见QSkinny,一个轻量级Qt UI库

目录 一.QSkinny简介 二.工作原理 三.编译 一.QSkinny简介 QSkinny库基于Qt Graphic View和Qt/Quick中少量的核心类。它提供了一组轻量级控件,可以在C或QML中使用这些控件。QSkinny默认是启用硬件加速的,非常适合嵌入式设备,目前已经应用于…

修改SSH默认端口,使SSH连接更安全

以CentOS7.9为例: 1、修改配置文件 vi /etc/ssh/sshd_config 2、远程电脑可连接,暂时将SELinux关闭 # 查询状态 getenforce # 关闭 setenforce 0 # 开启 setenforce 1 3、SELinux设置(如果启用),semanage管理工具安…

XCTF-Misc1 pcap1 misc2-1

pcap1 附件是一个xxxxx.pcap流量包 分析 1. 流量包筛选 统计协议分级,发现主要是TCP协议 查看TCP协议的流量包,筛选关键词tcp contains flag 跟踪TCP流,发现是python代码,将其导出 2. 导出的代码分析 导出的代码&#xff…

计算机图形学作业:Cohen-Sutherland和Liang-Barsky 裁剪算法

参考书籍和资料: Liang-Barsky参考下面视频14.2.1 [14.2.1]--讲解经典的梁友栋-巴斯基算法。_哔哩哔哩_bilibili Cohen-Sutherland参考孔令德的计算机图形学实验及课程设计(第二版),实验五直线段的裁剪 题目如下: …

助力智能密集人群检测计数,基于YOLOv8全系列模型【n/s/m/l/x】开发构建通用场景下密集人群检测计数识别系统

在一些人流量比较大的场合,或者是一些特殊时刻、时段、节假日等特殊时期下,密切关注当前系统所承载的人流量是十分必要的,对于超出系统负荷容量的情况做到及时预警对于管理团队来说是保障人员安全的重要手段,本文的主要目的是想要…

springboot基于Web的社区医院管理服务系统源码和论文

在Internet高速发展的今天,我们生活的各个领域都涉及到计算机的应用,其中包括社区医院管理服务系统的网络应用,在外国线上管理系统已经是很普遍的方式,不过国内的管理系统可能还处于起步阶段。社区医院管理服务系统具有社区医院信…

node.js笔记(1)

node,js是一个基于chrome v8引擎的javascript运行环境。 浏览器是javascript的前端运行环境。 node.js是javascript的后端运行环境。 node.js中无法调用浏览器中内置的DOM和BOM等API。 node.js作为一个javascript的运行环境,仅仅提供了基础的功能和API。 浏览器中…

线索系统性能优化实践

引言 在京东家居事业部,线索CRM系统扮演着至关重要的角色,它作为构建家居场景核心解决方案集的首要环节,肩负着获客和拓展业务的重要使命。然而,随着业务的不断扩张和市场需求的日益增长,系统原有的架构开始显露出诸多…

Github搭建图床 github搭建静态资源库 免费CDN加速 github搭建图床使用 jsdelivr CDN免费加速访问

Github搭建图床 github搭建静态资源库 免费CDN加速 github搭建图床使用 jsdelivr CDN免费加速访问 前言1、创建仓库2、开启 gh-pages页面功能3、访问测试 前言 写博客文章时,图片的上传和存放是一个问题,使用小众第三方图床,怕不稳定和倒闭&…

RTL编码(1)——概述

一、RTL级描述 RTL(Register Transfer Level)级:寄存器+组合逻辑,其功能与时序用Verilog HDL(以下简称Verilog)或VHDL代码描述。 RTL描述包含了同步数字电路最重要的三个特征:组合逻…

24-1-9 bilibilic++音视频

下午两点面试,面试官迟到了一会,面试官人很好,整体面试经历很不错,但是我人太紧张了,基础知识掌握的深度不够,没有深挖, 是做音视频的底层相关的, 实习要求只要每天打卡够九个小时就…

FineBI实战项目一(15):订单销售总额分析开发

点击新建组件,创建订单销售总额组件。 选择自定义图表,选择文本,拖拽要分析的字段到文本中。 进入仪表板,拖拽刚刚的组件进入仪表板,然后在再编辑标题。 效果如下

MySQL-外键等信息

38. 基础-多表查询-概述_哔哩哔哩_bilibili 1、流程函数 2、约束字段 删除外键 : alter table emp2 drop foreign key 外键名 //外键可以保持数据的一致性和完整性,外键的话,就是类似一个主表,一个从表,从表的其中一…

uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -投票帖子详情实现

锋哥原创的uniapp微信小程序投票系统实战: uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…

js中的class类

目录 class构造函数方法原型方法访问器方法静态方法 继承super minxin关于多态 class 在ES6中之前如果我们想实现类只能通过原型链和构造函数的形式,不仅难以理解步骤也十分繁琐 在ES6中推出了class关键字,它可以在js中定一个类,通过new来实…

Flink异步IO

本文讲解 Flink 用于访问外部数据存储的异步 I/O API。对于不熟悉异步或者事件驱动编程的用户,建议先储备一些关于 Future 和事件驱动编程的知识。 本文代码gitee地址: https://gitee.com/ddxygq/BigDataTechnical/blob/main/Flink/src/main/java/operator/AsyncIODemo.java …

ceph、gluster、longhorn选型对比

Ceph Ceph是一个分布式的存储系统,可以在统一的系统中提供唯一的对象、块和文件存储。 名词解释: RADOS: 由自我修复、自我管理、智能存储节点组成的可靠、自主、分布式对象存储LIBRADOS: 一个允许应用程序直接访问 RADO 的库&…

虚幻UE 材质-进阶边界混合之运行时虚拟纹理

之前在学习空山新雨后时对于边缘虚化过渡处理有很多技术 今天又要介绍一个边缘过渡的方法:运行时虚拟纹理 文章目录 前言一、运行时虚拟纹理二、使用步骤总结 前言 边缘过渡柔和的方式我们之前介绍了很多,但是效果也不是最好的。 像素偏移PDO和我们今天…

查准率与查全率在自然语言处理中的核心概念与联系、核心概念和实践应用,如何使用朴素贝叶斯、SVM 和深度学习实现查准率和查全率的计算?

查准率与查全率在自然语言处理中的核心概念与联系、核心概念和实践应用,如何使用朴素贝叶斯、SVM 和深度学习实现查准率和查全率的计算? 人工智能核心技术有:1. 深度学习;2.计算机视觉;3.自然语言处理;4.数据挖掘。其中,深度学习就是使用算法分析数据,从中学习并自动归…

jsonvue-mobile 联动方式说明。

目录 jsonvue-mobile的联动类型分为两种 一种是命令式的: 另一种是响应式的: 联动场景 场景一:某一个字段的值变化时,同步修改另一个字段的值 命令式: 响应式: 场景一演示效果GIF 场景二&#xff1…