当前位置: 首页 > 编程日记 > 正文

软件体系架构模式之一什么是软件架构模式

什么是软件架构模式

计划启动未开发的软件项目?然后选择正确的架构模式将对项目的结果起关键作用。选择市场上最流行或最新的技术并不总是意味着会带来最好的结果。但是,选择最合适的解决方案将为行之有效的问题和反复出现的问题提供可靠的解决方案。

在软件工程领域,有一句著名的谚语说:“对您的简历做出决定”。这是什么意思?IT专业人员喜欢用最新,最先进的技术来装饰自己的简历,这将对他们的下一次面试有所帮助,但实际上对项目没有好处。例如,如果您的项目是为调查构建常规的数据捕获表单(不超过10个字段),并且少于100个用户只能使用一次,那么使用微服务等高度复杂的架构模式将是一场彻底的灾难。这就像建造一架战斗机只是为了逛街尽头的杂货店。

选择架构模式时必须进行彻底的计划,并且必须考虑以下功能。

成本

上市时间

用户数量(当前和将来)

隔离级别(即:与其他系统/平台集成)

如果我们开发没有任何架构模式的系统会怎样?最终将导致一个“大泥球”,每个阶层都与其他阶层相连。

一个大泥球

因此,只要您更改一个类的行为或结构,就会在其他多个类破裂的地方产生涟漪效应。您的软件是这样的吗?找出答案的最佳方法是使用软件设计逆向工程工具(如hex-ray)来分析您的组件/类结构。如果最终遇到上图所示的情况,那么就该重新考虑并对软件设计进行一些更改了。

为了帮助您,我们将浏览主要软件架构模式的基础知识,以及每种模式的优缺点。然后,我们将详细说明哪种架构模式最适合给定场景。但是我们需要牢记一件事。在软件体系结构方面,没有黑白答案。不存在正确或错误的体系结构。它是非常主观的,并且取决于前面提到的多种因素。

什么是软件架构模式?

创建软件系统基本结构的原则称为软件体系结构。软件结构由软件元素及其相互关系组成,这些元素起着蓝图的作用,规划了要执行的任务的模式。软件设计团队极大地依赖于这些软件架构模式。应当指出,必须明智地选择软件体系结构,因为一旦实施,就不容易更改。

软件架构模式很重要,因为它们是在架构设计中成功构建和测试的最佳解决方案的示例。有经验的开发人员会使用他们的知识和熟悉程度来包含这些模式,而不是在设计时人为或随机创建模式。此外,通过使用这些模式并突出显示它们,他们可以共享知识并教会新开发人员关键的设计策略。

软件架构模式的好处

模式有助于识别和指定抽象,这些抽象位于单个对象,类和组件的级别之上。单个应用程序本身很难解决一个复杂的问题。模式引入了具有多个应用程序组件的不同角色,从而有助于提供解决方案。他们定义了组成部分,以及他们在协作方式方面的职责和关系。

此外,这些解决方案描绘了所介绍角色之间的关系。例如,观察者模式包括两个主要角色,即主题和观察者。这两个角色通过基于推送的更改传播机制进行协作,该机制确保组件可以保持彼此一致的状态。

模式提供了一种通用语言和对设计概念的共同理解。即使某些算法,接口,实现和详细设计的重用并非总是可能的,这有助于简化架构知识和伪像的重用。例如,当开发人员了解Observer模式时,无需讨论如何管理其系统中一致的两个协作组件。

模式有助于记录软件体系结构。通过对后果和实现折衷的深入评估,模式可以追踪选择特定设计选择而不是其他选择的原因。通过记录软件的意图,行为和结构,可以发现其中的模式,从而使软件开发路径,实践和维护变得更加顺畅。产品线架构使用有益的模式,因此开发人员应该意识到这一点。如果没有,他们将在不了解基本结构,机制和控制流程的情况下,难以正确使用它。基于模式的体系结构文档通过帮助开发人员专注于主要设计决策来帮助解决冲突。

模式在具有明确定义的过程的软件构建中很有用。一些模式勾勒出特定的行为。这为满足特定领域中的应用程序的某些功能要求铺平了道路。例如,已记录了会计系统和公司财务以及提高响应系统容量的模式。

模式还可以以一种形式来捕获经验,这种形式可以独立于特定的项目细节和约束,实现范例甚至通常是编程语言。在理解编码原则并解决新项目中的设计挑战时,开发人员可以实施容易出错,效率低下或无法维护的解决方案。模式可帮助开发人员选择合适的软件体系结构,而不会陷入域中的潜在陷阱。

模式可以帮助来自不同编程语言文化的软件开发人员共享共同感兴趣的设计见解,同时还可以防止“语言大战”。在不同世代的开发人员之间进行知识转移有助于平衡并使各个社区的成员能够交流并重新关注特定语言社区的关注。尽管编码可能不同,但是可能会出现类似的模式,这些模式将支持新旧模式。

体系结构模式不是编码准则

必须注意,模式不能视为编码准则。可以将编码准则部分或从着重于代码样式的模式中放在一起。但是,事实并非如此。尽管有许多惯用的编码准则,但这不会自动使它们成为设计模式。例如,Sun Microsystem的JavaBeans规范一直将属性访问器的get和set前缀用作“设计模式”。但是,尽管这些前缀大多数都是模式,但即使在Java代码中,它们也无助于解决一般设计的设计问题。

建筑图案的应用

清楚地理解模式词汇总是很重要的,因为应用错误的模式会导致很多问题。有经验的开发人员将具有合理的判断力,这将有助于他理解在特定情况下何时不适合使用某种模式。如果应用不当,可能会导致不合适的设计和实现。

对模式有浅浅的了解可以给开发人员一种印象,即他们可能精通该模式,即使有更好的解决方案。一个很好的例子是了解复杂模式(例如Proactor和Reflection)的结构和参与者。这些知识仅仅是一个方面,因此还不够。对于有效的模式应用,重要的是模式的本质必须反映在其上下文中,而不仅仅是结构中。

原文:https://medium.com/@priyalwalpita

相关文章:

HP 服务器 iLO 远程控制软件 介绍

iLO了解:iLO 是一组芯片,内部是vxworks的嵌入操作系统,在服务器的背后有一个标准RJ45口对外连接生产用交换机或者带外管理的交换机。iLO 全名是 Integrated Lights-out,它是惠普某些型号的服务器上集成的远程管理端口,它能够允许用…

【MATLAB】数据分析之数据插值

插值:求过已知有限个数据点的近似函数。 区别于拟合: 拟合:已知有限个数据点求近似函数,不要求过已知数据点,只要求在某种意义下它在这些点上的总偏差最小。 基本常用的插值方法:拉格朗日多项式插值&…

迈斯!啊呸~数学

1.数论 快速幂 int po(int x,int y) {int ans1;while(y){if(y%21)ans1ll*ans*x%p;x1ll*x*x%p;y/2;}return ans; } 乘法逆元&#xff08;保证模域p与求逆元的数互质&#xff09; po(a,p-2);//a为需要求逆元的数 扩展欧几里得&#xff08;exgcd&#xff09; #include<cstdio&g…

软件体系架构模式之二分层体系结构

分层体系结构模式是n层模式&#xff0c;其中组件被组织在水平层中。这是设计大多数软件的传统方法&#xff0c;并且具有独立性。这意味着所有组件都是互连的&#xff0c;但彼此之间不依赖。 图1&#xff1a;分层架构 在此体系结构中有四层&#xff0c;其中每一层在模块和其中的…

linux下mysql的root密码忘记解决方法

1&#xff0e;首先确认服务器出于安全的状态&#xff0c;最安全的状态是到服务器的Console上面操作&#xff0c;并且拔掉网线&#xff0c;或者可以使用--skip-networking限制只能从本地连接2&#xff0e;修改MySQL的登录设置&#xff1a; # vim /etc/my.cnf在[mysqld]的段中加上…

【Python】turtle库的小应用

心血来潮&#xff0c;哈哈哈&#xff0c;画的不好&#xff0c;请多见谅 大家如果想要尝试turtle库&#xff0c;可以借鉴&#xff1a; https://www.cnblogs.com/nowgood/p/turtle.html 导入库&#xff0c;我的pycharm里可以直接使用&#xff0c;哈哈哈&#xff0c;不行就pip…

[转]MySQL修改时区的方法小结

本文转自&#xff1a;https://www.cnblogs.com/mracale/p/6064447.html 这篇文章主要介绍了MySQL修改时区的方法,总结分析了三种常见的MySQL时区修改技巧,包括命令行模式、配置文件方式及代码方式,需要的朋友可以参考下 方法一&#xff1a;通过mysql命令行模式下动态修改 1.1 查…

swift轮播图代码

import UIKit private let CycleCellID "CycleCellID" class BannerCycleView: UIView { var layout : UICollectionViewFlowLayout! var collectionView :UICollectionView! var pageContol : UIPageControl? var cycleTimer : Timer? let timeInterval : TimeI…

软件体系架构模式之三微内核体系架构

当您的软件系统或产品包含许多与外部实体的集成点时&#xff0c;微内核体系结构模式将非常有用。最重要的是&#xff0c;您将无法准确判断出将来将哪些实体集成到您的系统中。可以将微内核架构模式识别为基于插件的模式。。也称为插件架构模式&#xff0c;它由两个主要组件组成…

【MATLAB】交互式绘图(ginput,gtext,zoom)

1、ginput指令&#xff1a; [x,y]ginput(n) %&#xff08;其功能是用鼠标从二维图形中获取n个点的数据坐标&#xff09; x-8*pi:pi/100:8*pi; y1sin(x); y24*sin(x/4); plot(x,y1,r-,x,y2,k-); legend(sin(x),4sin(x/4)); grid on; [x,y]ginput(8); %在下方命令窗…

【斗医】【18】Web应用开发20天

原创作品&#xff0c;允许转载&#xff0c;转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://qingkechina.blog.51cto.com/5552198/1544928 本文通过获取首页内容来讲解Web页面拖拽获取当前页数据&#xff0c;功能类似在google查看图…

数据库和缓存一致性的问题

经常看到有人问怎么解决数据库和缓存一致性的问题&#xff0c;这个问题我觉得是不要去解决。 如果你不信你先看我列的几种情况 假设 数据库一开始和缓存都是1元。 用户更新数据库的同时双写缓存。 1.双写不删 写库充值10元>>>返回成功 ----- 时间间隔 <<<…

【MATLAB】数据分析之求函数的极限(limit)

在MATLAB中采用limit函数求某个具体函数的极限&#xff0c;其调用格式如下&#xff1a; limit(expr,x,a)&#xff1a;当xa时&#xff0c;对函数expr求极限&#xff0c;返回值为函数极限。limit(expr)&#xff1a;默认当x0时&#xff0c;对函数expr求极限&#xff0c;返回值为函…

Spring Boot集成Swagger导入YApi@无界编程

接口APi开发现状 现在开发接口都要在类似YApi上写文档&#xff0c;这样方便不同的团队之间协作&#xff0c;同步更新接口&#xff0c;提高效率。 但是如果接口很多&#xff0c;你一个个手工在YApi去录入无疑效率很低。 如果是使用Spring Boot集成Swagger可以直接导入YApi非常…

【MATLAB】数据分析之函数数值积分

一、数值积分问题的数学表达 称为积分节点&#xff0c;称为求积系数。右端公式称为左端定积分的某个数值积分。MATLAB支持三重以下的积分运算。分别为&#xff1a; 在计算积分时&#xff0c;要求积分区间是确定的。 二、一元函数的数值积分 1、quad函数&#xff1a;采用遍历的…

c++对象切片

什么事对象切片&#xff1a;c在将一个派生类转换为基类的过程中&#xff0c;派生类的一部分将被基类接收不到&#xff0c;只能留下基类大小的对象。传值调用的切片&#xff1a;#include<iostream> using namespace std; class Base { public: virtual void func1() { cou…

javascript数据结构与算法-队列

定义 队列是一种特殊的线性表&#xff0c;特殊之处在于它只允许在表的前端&#xff08;front&#xff09;进行删除操作&#xff0c;而在表的后端&#xff08;rear&#xff09;进行插入操作&#xff0c;和栈一样&#xff0c;队列是一种操作受限制的线性表。进行插入操作的端称为…

Oracle学习笔记十三 触发器

2019独角兽企业重金招聘Python工程师标准>>> 简介 触发器是当特定事件出现时自动执行的存储过程&#xff0c;特定事件可以是执行更新的DML语句和DDL语句&#xff0c;触发器不能被显式调用。 触发器的功能&#xff1a; 1.自动生成数据 2.自定义复杂的安全权限 3.提供…

使用Notepad++比较文件的差异

有时候需要比较两个文件的差异部分&#xff0c;如果不在git里可以使用Notepad的插件。 在Notepad中安装Compare插件 打开NotePad&#xff0c;点击工具栏上的插件--Plugin Manager--Show Plugin Manager&#xff0c;选中Compare 然后安装。 比如下看两个线程堆栈的差异&#xf…

【MATLAB】将向量表示的多项式用字符串输出的通用函数示例

%创建一个名为pprintf的M文件 function s pprintf(p) %UNTITLED7 此处显示有关此函数的摘要 % 此处显示详细说明 if nargin>1error(Too much input arguments); end while(p(1)0)p1[]; end llength(p); if l0s0; elseif l1snum2str(p(1)); elseif l2s strcat(num2str(p(…

30秒或更短的时间内弄懂的有用CSS代码片段

今天无意间看到这个&#xff0c;真的很牛逼&#xff0c;记录下中文网&#xff1a; caibaojian.com/30-seconds-…转载于:https://juejin.im/post/5bf278a85188255e9b61a226

【MATLAB】数据分析之多项式及其函数

1、多项式的表达式和创建 MATLAB中使用一维向量来表示多项式。将多项式按照降幂次序存放在向量中。 多项式就可以用向量 [2 3 5 0 1]来表示。 2、多项式求根 >> p[1 2 1]p 1 2 1>> r roots(p)r -1-13、由根创建多项式 >> r [2;3]r 23>>…

SpringBoot自定义异常源码分析

SpringBoot自定义异常源码分析 在类上加ControllerAdvice注解&#xff0c;在方法上加ExceptionHandler注解&#xff0c;就可以在方法里处理相应的异常。 1.自定义异常处理类AdditionalExceptionHandler 挂RestControllerAdvice注解&#xff1a; ------------------ 2.自定义…

Android 应用性能优化-StrictMode(严格模式)

为什么80%的码农都做不了架构师&#xff1f;>>> UI线程如果被阻塞5秒的话&#xff0c;那么应用程序此时就会弹出ANR的对话框&#xff0c;ANR对应用程序来说是一个很严重的问题。 如何防止应用程序出现ANR&#xff0c;怎么分析查看导致ANR问题的原因&#xff1f; 我…

跨进程通信,到底用长连接还是短连接

一个完整的软件系统大多数情况下是由多个进程共同协作进行的&#xff0c;哪怕它们在同一台服务器上。所以&#xff0c;进程之间如何进行高效的通信至关重要。 单个应用程序单个数据库这套基础开发套餐我相信每个人都经历过&#xff0c;甚至在初期它们还有可能部署在同一台服务器…

Java的List和Json转换以及StringRedisTemplate往redis存泛型对象

List转Json List<User> user new ArrayList(); String str JSON.toJSONString(user); Json 转List方法一 List<User> user JSON.parseArray(json,User.class); 如果是泛型方法需要使用TypeReference Json 转List 方法二 String json "[{}]"; Li…

【MATLAB】符号数学计算(一):符号对象的创建

一、符号对象的创建命令 1、函数命令sym( ) variablesym(A,flag)Ssym(A,flag) 如果A是(不带单引号)是一个数字、数值矩阵或者数值表达式&#xff0c;则输出结果是将数值对象转换成的符号对象。 如果A(带单引号)是一个字符串&#xff0c;输出结果则是将字符串转换成的符号对象…

分布式session一致性问题

传统的网站结构&#xff08;并发量不大&#xff0c;没有session的不一致的问题。传统的网站结构图&#xff1a; **结论&#xff1a;**从图中可以看出在传统的网站结构中&#xff0c;所有的客户端都连接一个服务器&#xff0c;每个客户端发送过来的请求都被该服务器处理&#…

切换阿里云maven源解决maven中央仓库下载太慢卡顿的问题

maven默认官方的中央仓库有时候很慢下载jar甚至会卡住&#xff0c;那么你可以切换到阿里云的maven源 在本地的maven文件夹新建settings.xml <?xml version"1.0" encoding"UTF-8"?> <settings xmlns"http://maven.apache.org/SETTINGS/1.…

【MATLAB】符号数学计算(二):符号运算中的运算符和函数

一般的这里就不再列举 1、算术运算符号 运算符号“ ”、“ . ”分别实现矩阵的共轭转置和非共轭转置。 >> syms a b c d; >> Asym([a,b;c,d])A [ a, b] [ c, d]>> R1AR1 [ conj(a), conj(c)] [ conj(b), conj(d)]>> R2A.R2 [ a, c] [ b, d] 2、关…