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.rhkb.cn/news/238022.html

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

相关文章

响应式Web开发项目教程(HTML5+CSS3+Bootstrap)第2版 例4-1 表单

代码 <!doctype html> <html> <head> <meta charset"utf-8"> <title>表单</title> </head><body> <!--<form action"URL地址" method"提交方式" name"表单名称" /*编码“多部…

Linux 基于 rsync 实现集群分发脚本 xsync

一、rsync 简介 rsync&#xff08;remote synchronize&#xff09;是 Liunx/Unix 下的一个远程数据同步工具。它可以通过 LAN/WAN 快速同步多台主机间的文件和目录&#xff0c;并适当利用 rsync 算法&#xff08;差分编码&#xff09;以减少数据的传输。 rsync 算法并不是每一次…

Maven《一》-- 一文带你快速了解Maven

目录 &#x1f436;1.1 为什么使用Maven 1. Mavan是一个依赖管理工具 ①jar包的规模 ②jar包的来源问题 ③jar包的导入问题 ④jar包之间的依赖 2. Mavan是一个构建工具 ①你没有注意过的构建 ②脱离IDE环境仍需构建 3. 结论 &#x1f436;1.2 什么是Maven &#x…

笔试案例2

目录 一、笔试案例 二&#xff0c;思维导图 一、笔试案例 09&#xff09;查询学过「张三」老师授课的同学的信息 selects.*,c.cname,t.tname,sc.score from t_mysql_teacher t, t_mysql_course c, t_mysql_student s, t_mysql_score sc where t.tidc.cid and c.cidsc.cid and …

Gitlab-ci:从零开始的前端自动化部署

一.概念介绍 1.1 gitlab-ci && 自动化部署工具的运行机制 以gitlab-ci为例&#xff1a; (1) 通过在项目根目录下配置.gitlab-ci.yml文件&#xff0c;可以控制ci流程的不同阶段&#xff0c;例如install/检查/编译/部署服务器。gitlab平台会扫描.gitlab-ci.yml文件&…

力扣刷题(两数相加)

给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数都不会以 0 …

工作压力测试

每个职场人都会遇到工作压力&#xff0c;在企业人力资源管理的角度来看&#xff0c;没有工作压力是人力资源的低效&#xff0c;适当的工作压力可以促使员工不断进取&#xff0c;然而每个人的抗压能力是不同的&#xff0c;同样的工作量和工作难度&#xff0c;不同的人在面对相同…

《Git学习笔记:Git入门 常用命令》

1. Git概述 1.1 什么是Git&#xff1f; Git是一个分布式版本控制工具&#xff0c;主要用于管理开发过程中的源代码文件&#xff08;Java类、xml文件、html页面等&#xff09;&#xff0c;在软件开发过程中被广泛使用。 其它的版本控制工具 SVNCVSVSS 1.2 学完Git之后能做…

原子类-入门介绍和分类说明、基本类型原子类

Atomic翻译成中文是原子的意思。在化学上,我们知道原子是构成一般物质的最小单位,在化学 反应中是不可分割的。在我们这里Atomic是指一个操作是不可中断的。即使是在多个线程一起执 行的时候,一个操作一旦开始,就不会被其他线程干扰。 基本类型原子类 AtomicInteger:整…

代码随想录——回溯

系列文章目录 代码随想录——回溯 文章目录 系列文章目录概述组合组合组合III电话号码的字母组合组合总和组合总和II 分割分割回文串** 复原ip地址 子集子集子集II 概述 回溯的本质就是递归遍历&#xff0c;但在完成某一条路之后会撤回到上一层&#xff0c;然后重新选择另一条…

章鱼网络 2023 年全回顾|暨12月进展报告

2023年&#xff0c;章鱼网络轻装上阵&#xff0c;身处加密行业的低谷中砥砺前行。 12月17日&#xff0c;经过整整1年时间的开发和打磨&#xff0c;章鱼网络在重磅上线 Octopus 2.0&#xff0c;即 $NEAR Restaking 和 NEAR-IBC&#xff0c;获得了社区和市场的一致认可&#xff…

Elasticsearch 快速入门指南【总结记录】

本文将介绍一些基本概念&#xff0c;帮助您快速入门使用Elasticsearch。 一、概述 ES用来解决什么问题&#xff1f;Elasticsearch是解决海量数据&#xff08;已经存在的数据&#xff09;全文检索的不二只选。 Elasticsearch是一个基于Java语言开发&#xff0c;建立在开源搜索…

java SSM物业管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM物业管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和 数据库&#xff0c;系统主要采用B/…

PCL 大地坐标转空间直角坐标(C++详细过程版)

目录 一、算法原理二、代码实现三、结果展示四、测试数据本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT生成的文章。 一、算法原理 二、代码实现 头文件及读取保存函数见:PCL 空间直角坐标转大地坐标(直接求解法C…

基于传统机器学习模型算法的项目开发详细过程

1 场景分析 1.1 项目背景 描述开发项目模型的一系列情境和因素&#xff0c;包括问题、需求、机会、市场环境、竞争情况等 1.2. 解决问题 传统机器学习在解决实际问题中主要分为两类&#xff1a; 有监督学习&#xff1a;已知输入、输出之间的关系而进行的学习&#xff0c;从而…

大数据StarRocks(六) :Catalog

StarRocks 自 2.3 版本起支持 Catalog&#xff08;数据目录&#xff09;功能&#xff0c;实现在一套系统内同时维护内、外部数据&#xff0c;方便您轻松访问并查询存储在各类外部源的数据。 1. 基本概念 内部数据&#xff1a;指保存在 StarRocks 中的数据。 外部数据&#xf…

【Python】使用pyinstaller打包为Windows平台的xxx.exe方法步骤

pyinstaller 是一个用于将 Python 代码打包成独立可执行文件的工具&#xff0c;它可以将 Python 代码打包成 Windows、Linux、Mac 等平台的可执行文件&#xff0c;方便用户在不同环境中运行。 pyinstaller用法&#xff1a; 1.安装pyinstaller库&#xff0c;这里以PyCharm环境为…

在CentOS中,对静态HTTP服务的性能监控

在CentOS中&#xff0c;对静态HTTP服务的性能监控和日志管理是确保系统稳定运行和及时发现潜在问题的关键。以下是对这一主题的详细探讨。 性能监控 使用工具监控&#xff1a;top、htop、vmstat、iostat等工具可以用来监控CPU、内存、磁盘I/O等关键性能指标。这些工具可以实时…

vscode打开c_cpp_properties.json文件的一种方式

步骤一 点击win32 步骤二 点击json 自动生成了

一、MOJO环境部署和安装

以Ubuntu系统为例。 安装mojo-CLI curl https://get.modular.com | MODULAR_AUTHmut_fe303dc5ca504bc4867a1db20d897fd8 sh - 安装mojo SDK modular auth mojo modular auth install mojo 查看mojo版本号 mojo --version 输入mojo指令&#xff0c;进入交互编程窗口