系统架构师—软件架构设计(一)概述、构建、视图、基本架构风格

2023-11-17

1.软件架构概述

  1. 需求分析到软件设计之间的过渡过程称为软件架构。只要软件架构设计好了,整个软件就不会出现坍塌性的错误,即不会崩溃。
  2. 架构设计就是需求分配,将满足需求的职责分配到组件上。
  3. 软件架构为软件系统提供了一个结构行为属性的高级抽象。
  4. 软件架构能够在设计变更相对容易的阶段,考虑系统结构的可选方案,便于技术人员与非技术人员就软件设计进行交互,能够展现软件的结构属性内部交互(行为))关系。
  5. 架构设计主要关注软件组件的结构属性交互作用(行为),并通过多种视图全面描述特定系统的架构。
    构件的描述构件的相互作用(连接件)指导构件集成的模式以及这些模式的约束组成。
  6. 软件架构不仅指定了系统的组织结构拓扑结构,并且显示了系统需求和构件之间的对应关系,提供了一些设计决策的基本原理
  7. 解决好软件的复用质量维护问题,是研究软件架构的根本目的。
  8. 软件架构设计包括提出架构模型产生架构设计进行设计评审等活动,是一个迭代的过程。
  9. 软件架构是项目干系人进行交流的手段,明确了对系统实现的约束条件,决定了开发和维护组织的组织结构,制约着系统的质量属性
  10. 软件架构使推理和控制的更改更加简单,有助于循序渐进的原型设计,可以作为培训的基础。
  11. 软件架构是可传递可复用的模型,通过研究软件架构可能预测软件的质量。.
  12. 软件体系结构风格是描述某一特定应用领域中系统组织方式的惯用模式。
  13. 架构风格定义一个系统家族,即一个架构定义一个词汇表和一组约束词汇表包含一些构件连接件类型,而这组约束指出系统是如何将这些构件连接件组合起来的。
  14. 架构风格反映了领域中众多系统所共有的结构语义特性,并指导如何将各个模块子系统有效地组织成一个完整的系统
  15. 对软件架构风格的研究实践促进对设计的重用,一些经过实践证实的解决方案也可以可靠地用于解决新的问题
  16. 架构设计的一个核心问题是能否达到架构级的软件复用
  17. 架构风格定义了用于描述系统的术语表和一组指导构建系统的规则

2.构件基本概述

  1. 构件是一个独立可交付的功能单元,外界通过接口访问其提供的服务。
  2. 构件由一组通常需要同时部署的原子构件组成。一个原子构件是一个模块和一组资源原子构件是部署、版本控制和替换的基本单位。原子构件通常成组的部署,但是它也能够被单独部署
  3. 构件和原子构件之间的区别在于,大多数原子构件永远都不会被单独部署,尽管它们可以被单独部署。相反,大多数原子构件都属于一个构件家族,一次部署往往涉及整个家族
  4. 一个模块是不带单独资源的原子构件
  5. 一个单独的包被编译成多个单独的类文件―—每个公共类都有一个。
  6. 模块是一组类和可能的非面向对象的结构体,比如过程或者函数。

3.构件与对象

3.1.构件的特性

  1. 独立部署单元
  2. 作为第三方的组装单元
  3. 没有(外部的)可见状态

3.2.对象的特性

  1. 一个实例单元,具有唯一的标志
  2. 可能具有状态,此状态外部可见
  3. 封装了自己的状态和行为

3.3.构件接口

接口标准化是对接口中消息的格式模式协议的标准化。
它不是要将接口格式化为参数化操作的集合,而是关注输入输出的消息的标准化,它强调当机器在网络中互连时,标准的消息模式格式协议的重要性。

3.4.面向构件的编程(COP)

关注于如何支持建立面向构件的解决方案。“面向构件的编程需要下列基本的支持:

  1. 多态性(可替代性)
  2. 模块封装性(高层次信息的隐藏)
  3. 后期的绑定和装载(部署独立性)
  4. 安全性(类型和模块安全性)

4.软件架构建模

  1. 结构模型
    以架构的构件、连接件和其他概念来刻画结构,并试图以结构模型来反应整个系统的配置、内在逻辑等。

  2. 框架模型
    不太侧重描述结构的细节而更侧重于整体的结构;主要是针对具体的问题为目标,来设计适应这个问题的模型。

  3. 动态模型
    系统的大颗粒的行为性质,对结构模型和框架模型的补充,描述系统的演化。

  4. 过程模型
    构建系统的步骤和过程。

  5. 功能模型
    由一组功能构件按层次组成,下层向上层提供服务。

5.四+1视图

在这里插入图片描述

6.基本架构风格

6.1.数据流风格

面向数据流,按照一定的顺序从前向后执行程序,代表的风格有批处理序列、管道-过滤器。

  1. 批处理序列
    构件为一系列固定顺序的计算单元,构件之间只通过数据传递交互。每个处理步骤是一个独立的程序,每一步必须在其前一步结束后才能开始,数据必须是完整的,以整体的方式传递。
  2. 管道-过滤器
    每个构件都有一组输入和输出,构件读取输入的数据流,经过内部处理,产生输出数据流。前一个构件的输出作为后一个构件的输入,前后数据流关联。过滤器就是构件,连接件就是管道。

早期编译器就是采用的这种架构,要一步一步处理的,均可考虑此架构风格。

二者区别
批处理前后构件不一定有关联,并且是作为整体传递,即必须前一个执行完才能执行下一个。
管道-过滤器是前一个输出作为后一个输入,前面执行到部分可以开始下一个的执行。

6.2.调用/返回风格

构件之间存在互相调用的关系,一般是显式的调用,代表的风格有主程序/子程序、面向对象、层次结构。

  1. 主程序/子程序
    单线程控制,把问题划分为若干个处理步骤,构件即为主程序和子程序,子程序通常可合成为模块。过程调用作为交互机制,充当连接件的角色。调用关系具有层次性,其语义逻辑表现为主程序的正确性取决于它调用的子程序的正确性。
  2. 面向对象
    构件是对象,对象是抽象数据类型的实例。在抽象数据类型中,数据的表示和它们的相应操作被封装起来,对象的行为体现在其接受和请求的动作。连接件即使对象间交互的方式,对象是通过函数和过程的调用来交互的。
  3. 层次结构
    构件组成一个层次结构,连接件通过决定层间如何交互的协议来定义。每层为上一层提供服务,使用下一层的服务,只能见到与自己邻接的层。通过层次结构,可以将大的问题分解为若干个渐进的小问题逐步解决,可以隐藏问题的复杂度。修改某一层,最多影响其相邻的两层(通常只能影响上层)。

层次结构优点:
1、支持基于可增加抽象层的设计,允许将一个复杂问题分解成一个增量步骤序列的实现。
2、不同的层次处于不同的抽象级别,越靠近底层,抽象级别越高;越靠近顶层,抽象级别越低。
3、由于每一层最多只影响两层,同时只要给相邻层提供相同的接口,允许每层用不同的方法实现,同样为软件复用提供了强大的支持。
层次结构缺点:
1、并不是每个系统都可以很容易的划分为分层的模式。
2、很难找到一个合适的、正确的层次抽象方法。

6.3.独立构件风格

构件之间是互相独立的,不存在显式的调用关系,而是通过某个事件触发、异步的方式来执行,代表的风格有进程通信、事件驱动系统(隐式调用)。

  1. 进程通信
    构件是独立的进程,连接件是消息传递。构件通常是命名过程,消息传递的方式可以是点对点、异步或同步方式,以及远程过程(方法)调用等。
  2. 事件驱动系统(隐式调用)
    构件不直接调用一个过程,而是触发或广播一个或多个事件。构件中的过程在一个或多个事件中注册,当某个事件被触发时,系统自动调用在这个事件中注册的所有过程。一个事件的触发就导致了另一个模块中的过程调用。这种风格中的构件是匿名的过程,它们之间交互的连接件往往是以过程之间的隐式调用来实现的。

主要优点是为软件复用提供了强大的支持,为构件的维护和演化带来了方便;
缺点是构件放弃了对系统计算的控制。

6.4.虚拟机风格

自定义了一套规则供使用者使用,使用者基于这个规则来开发构件,能够跨平台适配,代表的风格有解释器、基于规则的系统。

  1. 解释器
    通常包括一个完成解释工作的解释引擎、一个包含将被解释的代码的存储区、一个记录解释引擎当前工作状态的数据结构,以及一个记录源代码被解释执行的进度的数据结构。具有解释器风格的软件中含有一个虚拟机,可以仿真硬件的执行过程和一些关键应用,缺点是执行效率低。

基于规则的系统:包括规则集、规则解释器、规则/数据选择器和工作内存,一般用在人工智能领域和DSS中。

6.5.仓库风格

以数据位中心,所有的操作都是围绕建立的数据中心进行的,代表的风格有数据库系统、超文本系统、黑板系统。

  1. 数据库系统
    构件主要有两大类,一类是中央共享数据源,保存当前系统的数据状态,另一类是多个独立处理单元,处理单元对数据元素进行操作。
  2. 黑板系统
    包括知识源、黑板和控制三部分。知识源包括若干独立计算的不同单元,提供解决问题的知识。知识源响应黑板的变化,也只修改黑板;黑板是一个全局数据库,包含问题域解空间的全部状态,是知识源相互作用的唯一媒介;知识源响应式通过黑板状态的变化来控制的。黑板系统通常应用在对于解决问题没有确定性算法的软件中(信号处理、问题规划和编译器优化等)。
  3. 超文本系统
    构件以网状链接方式相互连接,用户可以在构件之间进行按照人类的联想思维方式任意跳转到相关构件。是一种非线性的网状信息组织方法,它以节点为基本单位,链作为节点之间的联想式关联。通常应用在互联网领域。

现代编译器的集成开发环境一般采用数据仓储(即以数据为中心的架构风格)架构风格进行开发,其中心数据就是程序的语法树。

6.6.闭环控制(过程控制)

当软件被用来操作一个物理系统时,软件与硬件之间可以粗略的表示为一个反馈循环,这个反馈循环通过接受一定的输入,确定一系列的输出,最终使环境达到一个新的状态,适合于嵌入式系统,涉及连续的动作与状态。

例如:控制是遥控器,被控是空调,当使用遥控打开空调的时候的时候,遥控器显示一打开,实际空调未打开,这就是开环控制系统,此时控制发出指令后,是不需要被控系统做出响应的。
在这里插入图片描述

6.7.C2架构风格

C2体系结构风格可以概括为:通过连接件绑定在一起的按照一组规则运作的并行构件网络。
C2风格中的系统组织规则如下:

  1. 系统中的构件和连接件都有一个顶部和一个底部;
  2. 构件的顶部应连接到某连接件的底部,构件的底部则应连接到某连接件的顶部,而构件与构件之间的直接连接是不允许的;
  3. 一个连接件可以和任意数目的其它构件和连接件连接;
  4. 当两个连接件进行直接连接时,必须由其中一个的底部到另一个的顶部。
    在这里插入图片描述

6.8.各种类型架构常考关键字

在这里插入图片描述

7.架构描述语言ADL

ADL定义
ADL是一种形式化语言,在底层语义模型的支持下,为软件系统的概念体系结构建模提供了具体语法和概念框架。
基于底层语义的工具为体系结构的表示、分析、演化、细化、设计过程等提供支持。

ADL的基本构成要素

  1. 构件和构件接口
    计算单元或数据存储单元,是计算与状态存储的场所。
  2. 连接件
    用于构件之间交互建模的体系结构构造块及其支配这些交互的规则。
  3. 架构配置
    描述架构的构件与连接件的连接图。

主要的架构描述语言

  1. Aesop
    支持体系结构风格的应用。
  2. MetaH
    为设计者提供了关于实时电子控制软件系统的设计指导。
  3. C2
    支持基于消息传递风格的用户界面系统的描述。
  4. Rapide
    支持体系结构设计的模拟并提供了分析模拟结果的工具。
  5. SADL
    提供了关于体系结构加细的形式化基础。
  6. Unicon
    支持异构的构件和连接类型并提供了关于体系结构的高层编译器。
  7. Wright
    支持体系结构构件之间交互的说明和分析。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

系统架构师—软件架构设计(一)概述、构建、视图、基本架构风格 的相关文章

  • 在 Java Swing 中检测 JScrollPane 上的 mouseClick 事件

    如果我有这样的东西 我可以使用布尔标志 performAdjustment 控制自动滚动 static boolean performAdjustment true JTextArea textArea new JTextArea JScr
  • JAVA - 带有特殊字符的 LDAP 密码不起作用

    我试图在我的系统上创建一个登录屏幕 在 Active Directory 中进行查询 但是当用户的密码包含一些特殊字符 如 和 时 它不会验证 我需要加密密码才能工作吗 我该怎么做 我使用 getPassword 通过 JPasswordF
  • 如何自定义BlockingQueue的阻塞行为

    我想创建一个阻塞队列 它根据自定义规则而不是队列中的项目数量来阻止生产者 例如 生产者生成一些文件并放入队列中 消费者经过一番分析后将它们转移到特定位置 对于上述场景 如果队列中的总文件大小达到某个阈值 我希望生产者等待生成新文件 如果总大
  • Hibernate OneToMany 关系是 PersistentBag 而不是 List

    我正在 javafx 中开发一个应用程序 它通过 RMI 与 EAR 连接 该 EAR 连接到 SQLServer DB 并使用 hibernate 映射 POJOS 这些 POJOS 包含双向 OneToMany 和 ManyToOne
  • V8 如何管理它的堆?

    我知道V8的垃圾收集在工作时 会从GC的root开始追踪 这样无法到达的对象就会被标记然后被清除 我的问题是GC是如何遍历那些对象的 必须有一个数据结构来存储所有可达或不可达的对象 位图 链接表 顺便说一句 JVM 也做同样的事情吗 艾伦秀
  • Java Swing:清除JList而不触发监听器

    我的情况如下 我有一个 JList 只要在列表中进行选择 它就会触发搜索 使用 ListSelectionListener 我正在尝试使用以下命令重置列表上的选择list clearSelection 这样做的问题是使用clearSelec
  • 以编程方式将 PEM 证书导入 Java KeyStore

    我有一个由两个文件 crt 和 key 组成的客户端证书 我希望将其导入到 java KeyStore 中 然后在 SSLContext 中使用 以通过 Apache 的 HTTPClient 发送 HTTP 请求 但是 我似乎找不到一种以
  • 如何在Spring的applicationContext.xml中指定默认范围来请求范围?

    我想让所有 bean 请求默认作用域 但是 Spring 文档说默认作用域是 Singleton 第 3 4 1 和 3 4 2 节http static springsource org spring docs 2 5 x referen
  • firestore快照监听器生命周期和定价之间有什么关系?

    在我的活动中 我有一个字符串列表 这些字符串表示我想要附加快照侦听器的 Firestore 文档 我使用 Acivity ModelView 存储库结构 在活动的 onCreate 中 我向 ViewModelProvider 询问适当的
  • 业务代表与服务定位器

    Business Delegate 和 Service Locator 之间有什么区别 两者都负责封装查找和创建机制 如果 Business Delegate 使用 Service Locator 来隐藏查找和创建机制 那么 Busines
  • Java 的 QP 求解器 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 会话 bean 中的 EntityManager 异常处理

    我有一个托管无状态会话 bean 其中注入了 EntityManager em 我想做的是拥有一个具有唯一列的数据库表 然后我运行一些尝试插入实体的算法 但是 如果实体存在 它将更新它或跳过它 我想要这样的东西 try em persist
  • Java G1 GC 处理引用对象运行缓慢

    我已经在 J ava 上运行了计数器 它24小时工作 每秒点击通过100次左右 白天 GC 处理时间从 20 60 毫秒缓慢上升到 10000 60000 毫秒 然后下降到 20 60 毫秒 这种模式不时地重复 从 GC 日志中我发现 GC
  • 如何在将数据发送到 Firebase 数据库之前对其进行加密?

    我正在使用 Firebase 实时数据库制作聊天应用程序 我知道 Firebase 非常安全 只要您的规则正确 但我自己可以阅读使用我的应用程序的人的所有聊天记录 我想阻止这种情况 为此我需要一种解密和加密方法 我尝试使用凯撒解密 但失败了
  • 通用 JSF 实体转换器[重复]

    这个问题在这里已经有答案了 我正在编写我的第一个 Java EE 6 Web 应用程序作为学习练习 我没有使用框架 只是使用 JPA 2 0 EJB 3 1 和 JSF 2 0 我有一个自定义转换器 用于将存储在 SelectOne 组件中
  • java中的比较器链

    正在阅读Oracle 关于接口的 Java 教程 https docs oracle com javase tutorial java IandI createinterface html其中给出了一个例子Card 打牌 我试图理解接口中的
  • Scala repl 抛出错误

    当我打字时scala在终端上启动 repl 它会抛出此错误 scala gt init error error while loading AnnotatedElement class file usr lib jvm java 8 ora
  • Android同步onSensorChanged?

    这是我的问题的后续 Android线程可运行性能 https stackoverflow com questions 36395440 android thread runnable performance 我在理解应用程序的同步方法时遇到
  • Java泛型类型

    当我有一个界面时 public interface Foo
  • 如何在Java中跨类共享变量,我尝试了静态不起作用

    类 Testclass1 有一个变量 有一些执行会改变变量的值 现在在同一个包中有类 Testclass2 我将如何访问 Testclass2 中变量的更新值 由 Testclass1 更新 试过这个没用 注意 Testclass1和Tes

随机推荐

  • springboot多版本管理

    达到的版本控制效果如下 1 api版本定义在url中 采用 api 项目名 pro v4 接口名 的形式 2 api版本号通过注解进行定义 3 如果请求中不指定api版本号则返回最新版本 4 版本的自动适配 如果请求的api版本不存在 则返
  • 详解微信小程序网络请求接口封装

    为实现定制要求和方便调用 对微信小程序的网络请求接口进行了封装 在根目录新建api文件夹并新建httpRequest js与config js文件 1 设置请求域名 设置请求域名 let ENV wxConfig envVersion le
  • the import org.junit.Assert.* cannot be revolved的解决方法

    the import org junit Assert cannot be revolved的解决方法 具体解决方法 右键单击项目名 选择buildpath gt add library 弹出配置对话框 选择junit next下一步 系统
  • python想获取字符串str的长度_如何使用python获取字符串长度?哪些方法?

    掌握多种python技巧 对于我们更好的灵活应用python是非常重要的 比如接下来给大家介绍的获取字节长度 那大家脑海里就该有印象了 有几种方法呢 一起来看下吧 1 使用len 函数 这是最直接的方法 在这里 我们使用len 函数 字符串
  • 【python】将python代码打包成系统可执行文件(Pyinstaller模块)

    python文件打包输出可执行文件 1 Pyinstaller模块下载 2 Pyinstaller的使用 2 1 打开命令行 指引文件路径 2 2 直接生成可执行文件 3 常用指令 3 1 修改图标 3 2 修改名称 3 3 修改路径 1
  • 知识图谱,为移动搜索而生

    核心提示 当你尝试搜索 冰桶挑战 是什么决定你在搜索引擎上看到的内容呢 移动互联网时代 搜索引擎如何才能足够精准 个性化呢 这背后需要一个共同的作用机制 知识图谱 最近 冰桶挑战 挺火的 好奇心驱使我百度一下 看到如下结果 可能是做搜索的职
  • 人脸口罩检测 Python

    随着全球疫情的爆发 佩戴口罩成为了一项重要的健康和安全措施 在这种情况下 开发一个能够自动检测人脸是否佩戴口罩的系统变得非常有用 在本文中 我们将使用 Python 编程语言来实现一个简单的人脸口罩检测系统 首先 我们需要安装一些必要的 P
  • R语言mgarch包的说明_【R语言】优雅的循环迭代:purrr包

    用 R 写 循环 从低到高有三种境界 手动 for 循环 apply 函数族 purrr 包泛函式编程 补充一点 关于purrr 与 apply 族 purrr 提供了更多的一致性 规范性和便利性 更容易记住和使用 速度来说 apply 族
  • java多线程中synchronized同步代码块执行问题

    在高洪岩老师的 java多线程编程核心技术 一书的用同步代码块解决同步方法的弊端一节中 p76页 有这样一句话 当一个线程访问object的一个synchronized同步代码块时 另一个线程依然可以访问该object对象中的非synchr
  • Flash存储芯片:NOR Flash、NAND Flash、UFS和eMMC的比较与解析

    前言 在数字化时代的今天 数据的存储和管理变得越来越重要 各种各样的存储技术应运而生 以满足不同的使用场景和需求 其中 Flash存储芯片以其非易失性 可擦写性和可编程性等优势 占据了重要地位 本博客将详细介绍Flash存储芯片中的NOR
  • js屏蔽鼠标右键菜单&键盘ctrl+c,ctrl+v等

    文章目录 前言 一 效果展示 二 源代码 总结 前言 js屏蔽鼠标右键菜单以及屏蔽键盘ctrl c ctrl v ctrl a ctrl s ctrl p 一 效果展示 二 源代码
  • 数仓知识07:数据增量更新的几种方式

    1 增量更新的几种方式 增量更新的本质 其实是获取源表中数据变化的情况 增 删 改 然后将源表中发生的变化同步至目标表中 不同的方式 获取源表中数据变化的情况不一样 受技术的限制 表结构的限制 某些方式可能无法获取到完整的数据变化情况 因此
  • 后端返回分页数据过滤不需要的字段,先将不需要的属性置为null

    IPage
  • 腾讯mini项目-【指标监控服务重构】2023-07-23

    今日已办 组会记录 进度以及问题 otelzap 上报 Log 附属在 span 的 event 中 可以去查看具体的日志信息 如 trace id span id 日志级别等 还可以自定义属性 详细可见 https sztubdi cod
  • 微软云计算操作系统Windows Azure 平台——云+端全面攻略

    微软云计算操作系统Windows Azure 平台 云 端全面攻略 Windows Azure Platform 开发入门 在云计算时代 有三个平台非常重要 即开发平台 部署平台和运营平台 Windows Azure Platform是微软
  • I2S与pcm的区别

    I2S仅仅是PCM的一个分支 接口定义都是一样的 I2S的采样频率一般为44 1KHZ和48KHZ做 PCM采样频率一般为8K 16K 有四组信号 位时钟信号 同步信号 数据输入 数据输出 I2S总线标准 I2S Inter IC Soun
  • python 调用C DLL库 传参(传递数字、字符串、数组(一维、二维)、结构体)

    usr bin env python conding utf 8 from itertools import filterfalse import PySimpleGUI as sg from ctypes import cdll from
  • 如何将tomcat的http访问,改为https方式访问

    在执行以下操作的时候 需要先了解一个证书生成工具 keytool 他是jdk自带的证书管理工具 在jdk bin目录下 可以用来生成自签名证书 导入导出证书 打印证书信息等 整个过程分为两部分 第一部分是证书的生成 第二部分是修改tomca
  • C语言 五子棋游戏(也可n子棋)

    目录 1 创造棋盘 2 玩家下棋 3 电脑下棋 4 判断输赢 赢的判断 也是最难的 行的判断 列的判断 主副对角线的判断 花费时间最长 平局或者继续 最后判断的全部代码 三个文件的代码 头文件的引用及函数的声明 测试部分 函数的实现 一个文
  • 系统架构师—软件架构设计(一)概述、构建、视图、基本架构风格

    1 软件架构概述 从需求分析到软件设计之间的过渡过程称为软件架构 只要软件架构设计好了 整个软件就不会出现坍塌性的错误 即不会崩溃 架构设计就是需求分配 将满足需求的职责分配到组件上 软件架构为软件系统提供了一个结构 行为和属性的高级抽象