10 个常用的软件架构模式

ic4f10gp83 6年前
   <p>你是否曾经思考过如何设计大型的企业级系统?在决定启动软件开发之前,首要的是选择恰当的架构来指引系统的功能及质量属性设计。因此在将软件架构应用于设计之前,必需要了解常用的架构模式。</p>    <p><img src="https://simg.open-open.com/show/b1e0f61121a1f70bbe0eb9e955e33c92.jpg" alt="10 个常用的软件架构模式" width="550" height="275"></p>    <h2>什么是架构模式?</h2>    <p>Wikipedia 的解释:</p>    <p>在软件架构中,架构模式是对特定环境下常见问题的通用且可重用的解决方案。架构模式与软件设计模式很相似,但架构模式的层次更高,且外延更大。</p>    <p>这篇文章将简述常见的 10 种架构模式的概念、用法以及其优缺点。</p>    <ol>     <li>分层模式(Layered pattern)</li>     <li>客户端/服务器模式(Client-server pattern)</li>     <li>主/从模式(Master-slave pattern)</li>     <li>管道/过滤器模式(Pipe-filter pattern)</li>     <li>代理模式(Broker pattern)</li>     <li>对等模式(Peer-to-peer pattern)</li>     <li>事件总线模式(Event-bus pattern)</li>     <li>模型/视图/控制器(MVC)模式(Model-view-controller pattern)</li>     <li>黑板模式(Blackboard pattern)</li>     <li>解析器模式(Interpreter pattern)</li>    </ol>    <h2>1. 分层模式(Layered pattern)</h2>    <p>分层模式用于对结构化设计的软件进行层次拆解,每个层次为独立的抽象,为其上层抽象提供服务。</p>    <p>系统通常被拆分为以下四个层次:</p>    <ul>     <li>表示层(也称为 UI 层)</li>     <li>应用层(也称为服务层)</li>     <li>业务逻辑层(也称为领域层)</li>     <li>数据访问层(也称为持久化层)</li>    </ul>    <h3>使用场景</h3>    <ul>     <li>通用桌面应用程序</li>     <li>电子商务 Web 应用</li>    </ul>    <p><img src="https://simg.open-open.com/show/e4795665392347a6d4d582467dd5c5d9.jpg" alt="10 个常用的软件架构模式" width="188" height="329"></p>    <h2>2. 客户端/服务器模式(Client-server pattern)</h2>    <p>客户端/服务器模式由两个部分构成:一个服务器与多个客户端。服务器组件同时为多个客户端组件提供服务。客户端向服务器发启服务请求,服务器将相应服务信息回应给客户端。此外,服务器持续监听来自客户端的请求。</p>    <h3>使用场景</h3>    <ul>     <li>电子邮件、文件共享及银行业务等在线应用</li>    </ul>    <p><img src="https://simg.open-open.com/show/56f5f5944130b60b2d19fbfd07fe51cb.jpg" alt="10 个常用的软件架构模式" width="284" height="320"></p>    <h2>3. 主/从模式(Master-slave pattern)</h2>    <p>主/从模式由两个部分构成:主设备与从设备。主服务组件将作业分发给多个从设备组件,并根据这些从设备反馈的结果,计算生成最终结果。</p>    <h3>使用场景</h3>    <ul>     <li>数据库复制,主数据库被认定为权威数据源,各从数据库与主数据保持同步</li>     <li>在计算机系统中通过总线互连的各设备(包括主设备与从设备)</li>    </ul>    <p><img src="https://simg.open-open.com/show/1923176a5c295287302d4d59c6a6e358.jpg" alt="10 个常用的软件架构模式" width="542" height="212"></p>    <h2>4. 管道/过滤器模式(Pipe-filter pattern)</h2>    <p>管道/过滤器模式用于构造用于生成及处理数据流的系统。每个处理过程都封装在 <code>过滤器(filter)</code> 组件之中,要处理的数据通过 <code>管道(pips)</code> 进行投递。管道同时用于作为 <code>过滤器(filter)</code> 间的缓冲及同步。</p>    <h3>使用场景</h3>    <ul>     <li>编译器,一系列的过滤器用于词法分析、语法分析、语义分析及代码生成</li>     <li>生物信息学的工作流</li>    </ul>    <p><img src="https://simg.open-open.com/show/aa08d867b7e6e4dfda6a7ec73fd4f61a.jpg" alt="10 个常用的软件架构模式" width="550" height="105"></p>    <h2>5. 代理模式(Broker pattern)</h2>    <p>代理模式用于在结构化系统中对组件解耦。系统内各组件间采用远过程调用(remote service invocations)的方式交互。 <strong>代理(Broker)</strong> 组件充当组件间通讯的协调角色。</p>    <p>提供服务的组件将其能力(服务以及特性)发布给代理,客户端均向代理请求服务,由代理将请求重定向到先前已发布过对应服务的组件进行处理。</p>    <h2>使用场景</h2>    <ul>     <li>消息中间件软件:Apache ActiveMQ,Apache Kafka,RabbitMQ 与 JBoss 等等</li>    </ul>    <p><img src="https://simg.open-open.com/show/e7733d5d7de9602843e34821df3e0cfc.jpg" alt="10 个常用的软件架构模式" width="550" height="334"></p>    <h2>6. 对等模式(Peer-to-peer pattern)</h2>    <p>对等模式中的组件称之为对等体(peer),对等体既作为向其他对等体请求服务的客户端,同时也做为响应其他对等体请求的服务端。对等体可以在运行过程中动态地改变其角色,即,既可以单独做为客户端或服务端运行,又可同时作为客户端与服务端运行。</p>    <h3>使用场景</h3>    <ul>     <li>网络文件共享: <a href="/misc/goto?guid=4959757810684085229" rel="nofollow,noindex">Gnutella</a> 与 <a href="/misc/goto?guid=4959757810767089640" rel="nofollow,noindex">G2</a> )</li>     <li>流媒体协议: <a href="/misc/goto?guid=4959757810848543412" rel="nofollow,noindex">P2PTV</a> 与 <a href="/misc/goto?guid=4959757810940053834" rel="nofollow,noindex">PDTP</a> .</li>     <li>流媒体应用: <a href="/misc/goto?guid=4959757811026712237" rel="nofollow,noindex">Spotify</a> .</li>    </ul>    <p><img src="https://simg.open-open.com/show/9fc4a127eed8d43d815fa429a50ce1ec.jpg" alt="10 个常用的软件架构模式" width="260" height="248"></p>    <h2>7. 事件总线模式(Event-bus pattern)</h2>    <p>事件总线模式应用于事件处理,主要由四个组件构成: 事件源(event source),事件侦听者(event listener),通道(Channel)以及总线(event bus) 。 事件源将消息发布到总线的特定通道,侦听者订阅相应的通道,事件源所发布的消息经通道通告给订阅通道的侦听者。</p>    <h3>使用场景</h3>    <ul>     <li>Android 开发</li>     <li>通告(Notification)服务</li>    </ul>    <p><img src="https://simg.open-open.com/show/1eec6e040b2dc0d1c6ebe8b738379c7d.jpg" alt="10 个常用的软件架构模式" width="550" height="352"></p>    <h2>8. 模型/视图/控制器(MVC)模式(Model-view-controller pattern)</h2>    <p>模型/视图/控制器模式(简称 MVC 模式)将交互式应用程序拆分为三个部分:</p>    <ol>     <li><strong>模型(model)</strong> – 包含核心功能及数据</li>     <li><strong>视图(view)</strong> – 呈现信息给用户(通过有多个视图)</li>     <li><strong>控制器(controller)</strong> – 处理用户的输入操作</li>    </ol>    <p>MVC 模式通过将内部信息表示、用户信息呈现以及用户操作接收分开的方式解耦组件,实现高效代码重用。</p>    <h3>使用场景</h3>    <ul>     <li>主流开发语言所构建的互联网网页应用架构</li>     <li><a href="/misc/goto?guid=4959757811110400941" rel="nofollow,noindex">Django</a> 与 <a href="/misc/goto?guid=4959757811194823615" rel="nofollow,noindex">Rails</a> 等网页应用开发框架</li>    </ul>    <p><img src="https://simg.open-open.com/show/82cf0a18385350e1173b1d406766a2c5.jpg" alt="10 个常用的软件架构模式" width="550" height="239"></p>    <h2>9. 黑板模式(Blackboard pattern)</h2>    <p>黑板模式适用于 <code>无预知确定解决策略</code> 的问题,主要由三个组件构成:</p>    <ul>     <li><strong>黑板(blackboard)</strong> – 用于存储解空间对象的结构化全局内存</li>     <li><strong>知识(knowledge)</strong> 源 – 能自表意的专用模块</li>     <li><strong>控制(control)</strong> 组件 – 选择、配置与执行的模块</li>    </ul>    <p>所有的组件均能访问黑板,组件可将新生成的数据对象写入黑板,也可以通过模式匹配从黑板中获取知识源所生成的特定数据。</p>    <h3>使用场景</h3>    <ul>     <li>语音识别</li>     <li>车辆识别和追踪</li>     <li>蛋白质的结构鉴定</li>     <li>声纳信号解析</li>    </ul>    <p><img src="https://simg.open-open.com/show/4c9910df3f8af0064ce961a4fbdb4eca.jpg" alt="10 个常用的软件架构模式" width="530" height="299"></p>    <h2>10. 解析器模式(Interpreter pattern)</h2>    <p>解析器模式用于设计语言的解析程序,主要用于指定评估程序代码行,即解析出特定语言的语句与表达式,其核心思想是为语言的每个符号定义相应的类。</p>    <h3>使用场景</h3>    <ul>     <li>SQL 等数据库查询语言</li>     <li>通讯协议描述语言</li>    </ul>    <p><img src="https://simg.open-open.com/show/132b5aa926731b12f589ea0436c807aa.jpg" alt="10 个常用的软件架构模式" width="550" height="389"></p>    <h2>上述架构模式的对比</h2>    <p>下表格总结了各架构模式的优缺点</p>    <p><img src="https://simg.open-open.com/show/60d49d5be9e06a7db7c53eae2d78cf5d.png" alt="10 个常用的软件架构模式" width="550" height="262"></p>    <p> </p>