草庐IT

五种常见软件架构风格

孤独的探识者 2023-10-23 原文

目录

数据流风格(批处理序列;管道/过滤器)

批处理

管道/过滤器

调用/返回风格(主程序/子程序;面向对象风格;层次结构)

主程序/子程序

面向对象风格(普遍使用)

层次结构

独立构件风格(进程通信;事件系统)

进程通信

事件系统

虚拟机风格(解释器;基于规则的系统)

解释器

基于规则的系统

仓库风格(数据库系统;超文本系统;黑板系统)

数据库系统

超文本系统

黑板系统


  • 数据流风格(批处理序列;管道/过滤器

  • 批处理

特点:每一步处理都是独立的,并且每一步都是顺序执行的,只有当前一步处理完,后一步处理才能开始。数据传送在步与步之间作为一个整体。

典型应用:经典数据处理;程序开发;window下的BAT程序。

  • 管道/过滤器

特点:面向数据流传输,每个构件都有一组输入和输出,构件读输入的数据,经过内部处理,产生输出数据流。

优点:a)使软件具有良好的隐蔽性和高内聚、低耦合的特点 b)支持软件重用 c)系统维护和增强系统性能简单 d)支持并发执行

缺点:a)通常导致进程成为批处理的结构 b)不适合处理交互的应用 c)由于每个过滤器都增加了解析和合成数据的工作,导致系统性能下降。

  • 调用/返回风格(主程序/子程序;面向对象风格;层次结构

  • 主程序/子程序

特点:采用单线程控制,把问题划分为若干处理步骤,构件即为主程序和子程序。

  • 面向对象风格(普遍使用)

特点:建立在数据抽象和面向对象的基础上,对象是通过函数和过程的调用来交互的。

优点:a)改变一个对象的表示,不影响其他的对象 b)设计者可以将一些数据存取操作的问题分解为一些交互的代理程序集合。

缺点:a)对象的标识改变,就必须修改所有其他明确调用它的对象 b)必须修改所有显示调用它的其他对象,例如A 使用了对象 B C 也使用了对象 B,那么, C B 的使用所造成的对 A 的影响可能

  • 层次结构

特点:每一层为上层服务,并作为下层客户,允许将一个复杂问题分解成一个增量步骤序列。

缺点:并不是每个系统都很容易划分为分层模式,很难找到一个合适的正确的抽象方法。

实例:

1. 二层及三层C/S架构风格

二层:S:服务器(后台)复制数据管理;C:客户机(前台)完成与用户的交互。

三层:表示层:应用的用户接口,担任用户与应用间的对话功能;功能层:应用实体,实现业务的处理逻辑;数据层:数据管理系统,负责对数据库数据的读写。

2. B/S架构风格

浏览器/服务器,是三层结构的一种实现方式。

缺点:缺乏对动态页面的支持能力,没有集成有效的数据库处理功能,数据查询响应速度差。

3. MVC架构风格

模型(model)-视图(view)-控制器(controller)

4. MVP架构风格

Model-View-PresenterModel提供数据,View 负责显示,Controller/Presenter 负责逻辑的处理

优点:避免了view与model之间的耦合,进一步降低了presenter对view的依赖。

  • 独立构件风格(进程通信;事件系统

  • 进程通信

特点:构件是独立的过程(命名过程),连接件是消息传递(可以点对点、异步和同步方式及远程过程调用等)

  • 事件系统

特点:构件不直接调用一个过程,而是触发或广播一个或多个事件。

  • 虚拟机风格(解释器;基于规则的系统

  • 解释器

特点:可以仿真硬件执行过程和一些关键应用。

包含完成解释工作的解释引擎,一个包含将被解释的代码的存储区,一
个记录解释引擎当前工作状态的数据结构,以及一个记录源代码被解释执行进度的数据结构。

缺点:执行效率低

典型应用:专家系统。

  • 基于规则的系统

特点包括规则集、规则解释器、规则/数据选择器及工作内存。

  • 仓库风格(数据库系统;超文本系统;黑板系统

  • 数据库系统

特点:构件包含两大类,一个是中央共享数据源,保存当前系统的数据状态;一个是多个独立处理元素,处理元素对数据元素进行操作。

  • 超文本系统

典型应用:早期静态网页

  • 黑板系统

特点:在求解过程中综合应用多种不同的知识源,使得问题的表达、组织和求解变得容易,适用于解决复杂的非机构化问题。

包含:a)知识源 b)黑板数据结构 c)控制

典型案例:语言识别系统、信号处理系统、松耦合代理数据共享存取

有关五种常见软件架构风格的更多相关文章

  1. ruby - 模块嵌套代码风格偏好 - 2

    我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的

  2. 软件测试基础 - 2

    Ⅰ软件测试基础一、软件测试基础理论1、软件测试的必要性所有的产品或者服务上线都需要测试2、测试的发展过程3、什么是软件测试找bug,发现缺陷4、测试的定义使用人工或自动的手段来运行或者测试某个系统的过程。目的在于检测它是否满足规定的需求。弄清预期结果和实际结果的差别。5、测试的目的以最小的人力、物力和时间找出软件中潜在的错误和缺陷6、测试的原则28原则:20%的主要功能要重点测(eg:支付宝的支付功能,其他功能都是次要的)80%的错误存在于20%的代码中7、测试标准8、测试的基本要求功能测试性能测试安全性测试兼容性测试易用性测试外观界面测试可靠性测试二、质量模型衡量一个优秀软件的维度①功能性功

  3. git使用常见问题(提交代码,合并冲突) - 2

    文章目录git常用命令(简介,详细参数往下看)Git提交代码步骤gitpullgitstatusgitaddgitcommitgitpushgit代码冲突合并问题方法一:放弃本地代码方法二:合并代码常用命令以及详细参数gitadd将文件添加到仓库:gitdiff比较文件异同gitlog查看历史记录gitreset代码回滚版本库相关操作远程仓库相关操作分支相关操作创建分支查看分支:gitbranch合并分支:gitmerge删除分支:gitbranch-ddev查看分支合并图:gitlog–graph–pretty=oneline–abbrev-commit撤消某次提交git用户名密码相关配置g

  4. ruby - 将对象设置为 nil 是否很常见? - 2

    我正在构建一个应用程序,想知道是否将未使用的对象设置为nil是生产级编码中的常见做法。我知道这只是垃圾收集器的提示,并不总是处理对象。 最佳答案 根据这个thread如果您使用完一个成员对象,将其设置为nil将引发被引用对象被垃圾回收。如果它是局部变量,方法exit将做同样的事情。也就是说,如果您要求将成员显式设置为nil,我会质疑您的设计。 关于ruby-将对象设置为nil是否很常见?,我们在StackOverflow上找到一个类似的问题: https://

  5. c - Ruby - 源代码 - 编码风格 - 2

    查看Ruby代码,它具有以下proc_arity:staticVALUEproc_arity(VALUEself){intarity=rb_proc_arity(self);returnINT2FIX(arity);}更多的是C编码风格问题,但为什么staticVALUE在单独的一行而不是像这样的:staticVALUEproc_arity(VALUEself) 最佳答案 它来自UNIX世界,因为它有助于轻松grep函数的定义:$grep-n'^proc_arity'*.c或使用vim:/^proc_arity

  6. ruby - 变量赋值后的 if 语句 - 有多常见? - 2

    我最近与一位同事讨论了以下Ruby语法:value=ifa==0"foo"elsifa>42"bar"else"fizz"end我个人并没有看到太多这种逻辑,但我的同事指出,这实际上是一种相当普遍的Rubyism。我试着用谷歌搜索这个主题,但没有找到任何文章、页面或SO问题来讨论它,这让我相信这可能是一种非常实际的技术。然而,另一位同事发现语法令人困惑,而是将上面的逻辑写成这样:ifa==0value="foo"elsifa>42value="bar"elsevalue="fizz"end缺点是value=的重复声明和隐式elsenil的丢失,如果我们想使用它的话。这也感觉它与Ruby

  7. ruby - Ruby 和 Ruby on Rails 中的三层架构 - 2

    我是一名决定学习Ruby和RubyonRails的ASP.NETMVC开发人员。我已经有所了解并在RoR上创建了一个网站。在ASP.NETMVC上开发,我一直使用三层架构:数据层、业务层和UI(或表示)层。尝试在RubyonRails应用程序中使用这种方法,我发现没有关于它的信息(或者也许我只是找不到它?)。也许有人可以建议我如何在RubyonRails上创建或使用三层架构?附言我使用ruby​​1.9.3和RubyonRails3.2.3。 最佳答案 我建议在制作RoR应用程序时遵循RubyonRails(RoR)风格。Rails

  8. Ruby:如何将数组拼接成 Lisp 风格的列表? - 2

    这是我发现自己偶尔想做的事情。假设我有一个参数列表。在Lisp中,我可以像这样`(imaginary-function,@args)为了调用将数组从一个元素转换为正确数量的参数的函数。Ruby中是否有类似的功能?或者我只是在这里使用了一个完全错误的成语? 最佳答案 是的!它被称为splat运算符。a=[1,44]p(*a) 关于Ruby:如何将数组拼接成Lisp风格的列表?,我们在StackOverflow上找到一个类似的问题: https://stackov

  9. 网站日志分析软件--让网站日志分析工作变得更简单 - 2

    网站的日志分析,是seo优化不可忽视的一门功课,但网站越大,每天产生的日志就越大,大站一天都可以产生几个G的网站日志,如果光靠肉眼去分析,那可能看到猴年马月都看不完,因此借助网站日志分析工具去分析网站日志,那将会使网站日志分析工作变得更简单。下面推荐两款网站日志分析软件。第一款:逆火网站日志分析器逆火网站日志分析器是一款功能全面的网站服务器日志分析软件。通过分析网站的日志文件,不仅能够精准的知道网站的访问量、网站的访问来源,网站的广告点击,访客的地区统计,搜索引擎关键字查询等,还能够一次性分析多个网站的日志文件,让你轻松管理网站。逆火网站日志分析器下载地址:https://pan.baidu.

  10. 常见网络安全产品汇总(私信发送思维导图) - 2

    安全产品安全网关类防火墙Firewall防火墙防火墙主要用于边界安全防护的权限控制和安全域的划分。防火墙•信息安全的防护系统,依照特定的规则,允许或是限制传输的数据通过。防火墙是一个由软件和硬件设备组合而成,在内外网之间、专网与公网之间的界面上构成的保护屏障。下一代防火墙•下一代防火墙,NextGenerationFirewall,简称NGFirewall,是一款可以全面应对应用层威胁的高性能防火墙,提供网络层应用层一体化安全防护。生产厂家•联想网御、CheckPoint、深信服、网康、天融信、华为、H3C等防火墙部署部署于内、外网编辑额,用于权限访问控制和安全域划分。UTM统一威胁管理(Un

随机推荐