当前位置: 首页 > news >正文

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

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

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

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

相关文章:

3.4 在开发中使用设计模式

现在,我们应该对设计模式的本质以及它们的组织方式有了初步的认识,并且能够理解ROPES过程在整体设计中的作用。通过之前章节对“体系结构”及其五个视图的探讨,我们打下了坚实的基础。初步了解了UML的基本构建模块后,我们现在可以…...

docker搭建SSH镜像、systemctl镜像、nginx镜像、tomcat镜像

目录 一、SSH镜像 二、systemctl镜像 三、nginx镜像 四、tomcat镜像 五、mysql镜像 一、SSH镜像 1、开启ip转发功能 vim /etc/sysctl.conf net.ipv4.ip_forward 1sysctl -psystemctl restart docker 2、 cd /opt/sshd/vim Dockerfile 3、生成镜像 4、启动容器并修改ro…...

[linux] git clone一个repo,包括它的子模块submodule

How do I "git clone" a repo, including its submodules? - Stack Overflow git clone git://github.com/foo/bar.git cd bar git submodule update --init --recursive...

K8S中使用helm安装MinIO

注意事项 使用helm部署MinIO分为两部分 helm部署MinIO operator,用来管理tenant(K8S集群中只能部署一个)helm部署MinIO tenant,真实的MinIO Cluster(K8S集群中可以部署多个) 使用helm部署到K8S集群&…...

寒假刷题第六天

PTA甲级 1030 Travel Plan 迪杰斯特拉 #include<iostream> #include<vector> #include<cstring>using namespace std;const int N 510 , INF 0x3f3f3f3f3f; int n , m , s , d; int g[N][N] , cost[N][N] , dist[N] , min_cost[N]; bool st[N]; int pat…...

深度学习笔记(七)——基于Iris/MNIST数据集构建基础的分类网络算法实战

文中程序以Tensorflow-2.6.0为例 部分概念包含笔者个人理解&#xff0c;如有遗漏或错误&#xff0c;欢迎评论或私信指正。 截图和程序部分引用自北京大学机器学习公开课 认识网络的构建结构 在神经网络的构建过程中&#xff0c;都避不开以下几个步骤&#xff1a; 导入网络和依…...

Windows启动MongoDB服务报错(错误 1053:服务没有及时响应启动或控制请求)

问题描述&#xff1a;修改MongoDB服务bin目录下的mongod.cfg&#xff0c;然后在任务管理器找到MongoDB服务-->右键-->点击【开始】&#xff0c;启动失败无提示&#xff1a; 右键点击任务管理器的MongoDB服务-->点击【打开服务】&#xff0c;跳转到服务页面-->找到M…...

Android Framework 常见解决方案(25-2)定制CPUSET解决方案-system修改及编译部分调整

1 原理说明 这个方案有如下基本需求&#xff1a; 构建自定义CPUSET&#xff0c;/dev/cpuset中包含一个全新的cpuset分组。且可以通过set_cpuset_policy和set_sched_policy接口可以设置自定义CPUSET。开机启动后可以通过zygote判定来对特定的应用进程设置CPUSET&#xff0c;并…...

OpenAI推出GPT商店和ChatGPT Team服务

&#x1f989; AI新闻 &#x1f680; OpenAI推出GPT商店和ChatGPT Team服务 摘要&#xff1a;OpenAI正式推出了其GPT商店和ChatGPT Team服务。用户已经创建了超过300万个ChatGPT自定义版本&#xff0c;并分享给其他人使用。GPT商店集结了用户为各种任务创建的定制化ChatGPT&a…...

3D建模素材分层渲染怎么操作?

在3D建模素材分层渲染过程中&#xff0c;需要将场景中的元素分到不同的层里&#xff0c;然后分别进行渲染。以下是一个简单的方法&#xff1a; 1、打开要渲染的3D建模素材。 2、在场景中选择要分层的元素&#xff0c;然后在软件的图层面板中新建图层&#xff0c;将元素拖拽到新…...

SAICP(模拟退火迭代最近点)的实现

SAICP(模拟退火迭代最近点)的实现 注: 本系列所有文章在github开源, 也是我个人的学习笔记, 欢迎大家去star以及fork, 感谢! 仓库地址: pointcloud-processing-visualization 总结一下上周的学习情况 ICP会存在局部最小值的问题, 这个问题可能即使是没有实际遇到过, 也或多…...

FineBI实战项目一(23):订单商品分类词云图分析开发

点击新建组件&#xff0c;创建订单商品分类词云图组件。 选择词云&#xff0c;拖拽catName到颜色和文本&#xff0c;拖拽cat到大小。 将组件拖拽到仪表板。 结果如下&#xff1a;...

DOS命令

当使用DOS命令时&#xff0c;可以在命令提示符下输入各种命令以执行不同的任务。以下是一些常见DOS命令的详细说明&#xff1a; dir (Directory): 列出当前目录中的文件和子目录。 用法: dir [drive:][path][filename] [/p] [/w] cd (Change Directory): 更改当前目录。 用法: …...

【Python】torch中的.detach()函数详解和示例

在PyTorch中&#xff0c;.detach()是一个用于张量的方法&#xff0c;主要用于创建该张量的一个“离断”版本。这个方法在很多情况下都非常有用&#xff0c;例如在缓存释放、模型评估和简化计算图等场景中。 .detach()方法用于从计算图中分离一个张量&#xff0c;这意味着它创建…...

二级域名分发系统源码 对接易支付php源码 全开源

全面开源的易支付PHP源码分享&#xff1a;实现二级域名分发对接 首先&#xff0c;在epay的config.php文件中修改您的支付域名。 随后&#xff0c;在二级域名分发网站上做相应修改。 伪静态 location / { try_files $uri $uri/ /index.php?$query_string; } 源码下载&#…...

二分查找与搜索树的高频问题(算法村第九关白银挑战)

基于二分查找的拓展问题 山峰数组的封顶索引 852. 山脉数组的峰顶索引 - 力扣&#xff08;LeetCode&#xff09; 给你由整数组成的山脉数组 arr &#xff0c;返回满足 arr[0] < arr[1] < ... arr[i - 1] < arr[i] > arr[i 1] > ... > arr[arr.length - 1…...

Python爬虫快速入门

Python 爬虫Sutdy 1.基本类库 request(请求) 引入 from urllib import request定义url路径 url"http://www.baidu.com"进行请求,返回一个响应对象response responserequest.urlopen(url)读取响应体read()以字节形式打印网页源码 response.read()转码 编码 文本–by…...

部署MinIO

一、安装部署MINIO 1.1 下载 wget https://dl.min.io/server/minio/release/linux-arm64/minio chmod x minio mv minio /usr/local/bin/ # 控制台启动可参考如下命令, 守护进程启动请看下一个代码块 # ./minio server /data /data --console-address ":9001"1.2 配…...

RK3566环境搭建

环境&#xff1a;vmware16&#xff0c;ubuntu 18.04 安装依赖库&#xff1a; sudo apt-get install repo git ssh make gcc libssl-dev liblz4-tool expect g patchelf chrpath gawk texinfo chrpath diffstat binfmt-support qemu-user-static live-build bison flex fakero…...

精确掌控并发:滑动时间窗口算法在分布式环境下并发流量控制的设计与实现

这是《百图解码支付系统设计与实现》专栏系列文章中的第&#xff08;15&#xff09;篇&#xff0c;也是流量控制系列的第&#xff08;2&#xff09;篇。点击上方关注&#xff0c;深入了解支付系统的方方面面。 上一篇介绍了固定时间窗口算法在支付渠道限流的应用以及使用redis…...

零基础5分钟部署AI股票分析师:Ollama本地大模型一键生成专业报告

零基础5分钟部署AI股票分析师&#xff1a;Ollama本地大模型一键生成专业报告 1. 为什么你需要一个本地AI股票分析师 在金融投资领域&#xff0c;及时获取专业分析报告是做出明智决策的关键。但传统方式存在几个痛点&#xff1a; 数据隐私问题&#xff1a;使用在线分析工具需…...

零售AI开发者必看:Ostrakon-VL-8B终端从部署到任务执行完整指南

零售AI开发者必看&#xff1a;Ostrakon-VL-8B终端从部署到任务执行完整指南 1. 项目概览&#xff1a;像素特工终端 Ostrakon-VL-8B是一款专为零售与餐饮场景优化的多模态大模型&#xff0c;我们将其封装成了一个充满游戏趣味的Web交互终端。与传统工业级UI不同&#xff0c;这…...

REX-UniNLU在SpringBoot项目中的集成指南

REX-UniNLU在SpringBoot项目中的集成指南 1. 引言 如果你正在开发一个需要理解中文文本的SpringBoot应用&#xff0c;比如要做智能客服、内容分析或者自动分类&#xff0c;那么REX-UniNLU可能会是个不错的选择。这是一个专门为中文设计的自然语言理解模型&#xff0c;不需要训…...

PyTorch-2.x-Universal-Dev-v1.0镜像详解:预装库、国内源、GPU验证全攻略

PyTorch-2.x-Universal-Dev-v1.0镜像详解&#xff1a;预装库、国内源、GPU验证全攻略 1. 镜像概述与核心优势 PyTorch-2.x-Universal-Dev-v1.0镜像是一个专为深度学习开发者打造的高效开发环境。它基于官方PyTorch底包构建&#xff0c;经过精心优化和配置&#xff0c;旨在解决…...

霜儿-汉服-造相Z-Turbo科研辅助:使用LaTeX撰写包含AI生成图像的学术论文

霜儿-汉服-造相Z-Turbo科研辅助&#xff1a;使用LaTeX撰写包含AI生成图像的学术论文 最近在帮一位研究传统服饰的朋友整理论文&#xff0c;遇到了一个挺有意思的问题。他们需要大量汉服的结构示意图和纹样分析图&#xff0c;但手绘耗时&#xff0c;找现成资料又很难完全匹配研…...

PyJWT与云原生应用集成的终极指南:如何构建安全的微服务架构

PyJWT与云原生应用集成的终极指南&#xff1a;如何构建安全的微服务架构 【免费下载链接】pyjwt JSON Web Token implementation in Python 项目地址: https://gitcode.com/gh_mirrors/py/pyjwt PyJWT&#xff08;Python JSON Web Token&#xff09;是一个功能强大且易于…...

别再只看FLOPs了!从VoVNet的OSA模块看高效网络设计的实战误区

从VoVNet的OSA模块看高效网络设计的实战误区&#xff1a;为什么你的模型跑得比论文慢&#xff1f; 当我们在GitHub上复现一篇顶会论文时&#xff0c;最沮丧的瞬间莫过于&#xff1a;明明FLOPs和参数量完全匹配&#xff0c;实际推理速度却比论文报告值慢了30%。这个问题在部署De…...

OpenClaw性能调优实战:Qwen3-32B在RTX4090D上的量化推理加速

OpenClaw性能调优实战&#xff1a;Qwen3-32B在RTX4090D上的量化推理加速 1. 为什么需要性能调优&#xff1f; 去年冬天&#xff0c;当我第一次在RTX4090D上部署Qwen3-32B模型时&#xff0c;本以为24GB显存足以轻松应对各种任务。但现实很快给我上了一课——一个简单的网页内容…...

嵌入式系统中命令模式的应用与优化

1. 嵌入式系统中的误操作救赎之道在嵌入式开发中&#xff0c;参数配置误操作就像厨房里的盐罐打翻——一瞬间的失误可能导致整锅菜报废。上周我就遇到一个真实案例&#xff1a;某工业设备因为工程师误触"恢复出厂设置"&#xff0c;导致产线上30台设备参数全部重置&am…...

2026年专业深度测评:超强增压花洒套装排名前五权威榜单

一、开篇&#xff1a;行业趋势与测评声明随着消费者对居家生活品质要求的精细化提升&#xff0c;以及高层住宅、老旧小区水压不稳问题的普遍存在&#xff0c;具备稳定出水与舒适沐浴体验的超强增压花洒套装已成为市场核心需求。为帮助消费者在众多产品中做出科学决策&#xff0…...