您的位置:首页 > 运维架构 > 网站架构

面向模式的软件架构-卷1_1 (层 管道和过滤器 黑板)

2012-09-05 15:48 288 查看
体系结构模式

八种体系结构模式:层、管道和过滤器、黑板、代理者、模型-视图-控制器(MVC) 表示-抽象-控制(PAC)、微核、映像。

四类体系结构模式:

1. 从混沌到结构. 包含:黑板模式,Layers(层)模式, the Pipes and Filters(管道过滤器)模式;主要用处:避免太多的对象和组件

2. 分布式系统:包含Broker(代理者)模式,涉及管道过滤器模式和Microkerne(微核)模式

3. 交互式系统:包含MVC模式和Presentation-Abstraction-Control(PAC 表示-抽象-控制)模式

4. 适应性系统:映像模式和Microkerne(微核)模式

体系结构模式的选择:

1. 需要考虑当前应用的一般属性,例如是否是交互是系统,是否存在很多细微差别变化的系统,同时也需要考虑需要考虑应用的非功能需求(可更改性、可靠性等);

2. 考虑模式本身的特点,例如交互式系统MV一般比PAC更有效率,但是PAC在支持多任务和特定任务用户方面更合适;

3. 绝大多数软件体系结构都需要多种体系结构模式的配合使用。

从混沌到结构

层:有助于构造这样的应用:能够被分解成子任务组,其中每个子任务组处于一个特定的抽象层次上

管道和过滤器:适用于需要渐增式处理数据流的领域

黑板模式:在结构很差的(新的或者不成熟的领域中),我们只有处理特殊问题的零碎知识,黑板模式提供一种综合零碎知识解决问题的方法,在应用领域成熟后,一般会放弃黑板体系结构。

层:层有助于构建这样的应用:它能够被分解成子任务组,其中每一个子任务组处于一个特定的抽象层次上

例子:ISO 7层网络协议

语境:一个需要分解的大系统

问题:如果需要设计一个系统,显著特征是混合了底层和高层问题,高层操作依赖于底层操作。系统一部分处理底层问题,另外一部分有用户可见的功能,这样的系统往往需要一些与垂直子划分正交的水平构建,即几个操作处于同一个抽象出,但是彼此间很大程度上是独立的。同时有以下强制需求:

1后期源代码修改应该不影响整个系统,它们应该被限制在一个组件内不影响其他组件

2接口应该是稳定的,甚至可以用标准件来替代

3系统的各个部分应该可以替换,组件可以被别的实现方法替代而不影响系统的其他部分

4. 以后可能建立其他系统,这些系统与当前设计系统有同样的低层问题

5. 没有标准的组件粒度

6. 复杂组件需要进一步分解

7. 跨组件边界可能影响性能

8. 系统可有一个程序员组来创建,工作界限必须划分清楚

解决方案:将系统划分成适当层次,按适当次序防止。注意:某一层用到的组件工作在同一个抽象层。第j层得绝大多数服务器由第j-1层提供的服务组成,也就是说,每一次的服务的一种策略是有意义的组合低层得服务(也可以依赖同层服务)

实现:

1 为把任务分组成层定义抽象准则(例如 用户可见元素/特定应用模块/公共服务层/操作系统接口层/操作系统/硬件)

2.根据抽象准则定义抽象层数 (过多的层开销太大,过少的层结构太差)

3.为每一层命名并指定它们的任务

4.指定服务:严格分离,保证没有一个组件跨域多于一个层。注:把较多的服务放在高层更合适

5.细化分层 重复步骤1-4

6.为每层指定一个接口,然后黑盒化(更好的支持系统演化)(例外原因一般为效率,或者需要访问其他层得内部结构(可以使用映像模式协助))

7.构建独立层,注意独立层内的复杂度(过于复杂可以被分割为独立组件)

8.分离邻接层 高层只关心相邻的低层,低层不关心用户的身份(单路耦合)。对于自底向上通讯,可以使用回调函数的单路耦合

9.设计一种错误处理策略(层模式的错误处理代价一般比较高)

变体:

1. 松散分层结构,可以每个层都可以使用比它低的所有层得服务,也可以一个层部分不透明(部分服务相邻高层可见,部分服务所有高层可见)灵活性和性能增加=》可维护性降低(一般只用于修改非常少,性能要求很高的基础结构系统)

2. 通过继承分层 优点:高层可以根据需要修改底层服务,缺点:继承关系紧紧捆绑了低层和高层

实例:

1. 虚拟机

2. API

3. 信息系统

效果:

优点:

1. 层得重用,已存在层得黑盒重用会显著减少开发量和缺陷数

2. 标准化支持(POSIX编程接口)

3. 局部依赖性 可移植,可测试,修改不会影响超过一层

4. 可替换性

缺点:

1. 更改行为重叠 如果不得不在多层做相当数量的重复工作以合并外观上的局部变动,分层便成为一个缺点

2. 不必要的工作 低层的某些服务执行了多余或者重复的工作,高层可能并非真正需要,会影响性能

3. 难以认可的层得正确粒度.

管道和过滤器:为处理数据流的系统提供了一种结构。每一个处理步骤封装在一个过滤器组件中,数据通过相邻的过滤器之间的管道传输。

例子:directshow ?

语境:处理数据流

问题:一个必须处理或转化输入数据流的系统,很难被当做单个组件处理,原因可能为:可能需要几个开发人员、系统任务分解为几个处理阶段,需求很容易变动等

需要考虑的因素:

1. 未来的系统升级可以通过替换处理步骤做到

2. 小的处理步骤需要的小组件比完成整个处理步骤的大组件更容易重用

3. 存在不同的输入数据源

4. 可以用多种方式给出或者存放最终结果

5. 如果用户接触到中间结果存放,更容易出错

解决方案:

将系统任务分为几个序贯的处理步骤,这些步骤采用通过系统的数据流连接——一个步骤的输出是下一个步骤的输入。每个处理步骤由一个过滤器组件实现。系统的输入由数据源提供,输出流入数据汇点。通过管道联合的过滤器序列叫做处理器流水线。

结构:

过滤器组件是流水线的处理单元。过滤器丰富、提炼或者转换它的输入数据。一个具体的过滤器的实现要兼备如下三条基本原理:

1.随后的流水线单元从过滤器拉出输出数据;

2.前面的流水线器件把新的输入数据压入过滤器

3.最常用,过滤器以循环方式工作,从流水线中拉出其输入数据并且将输出数据压入流水线。

前两种情况为被动过滤器,最后一张为主动过滤器。

管道:过滤器之间的连接。数据源:系统的输入。数据汇点:收集来自流水线终端的结果。

实现:

1. 把系统任务分成一系列的出来阶段,每个阶段只依赖其前一阶段的输出,通过数据流将所有阶段在改良上联系袭来。

2. 定义沿每个管道传输的数据格式:定义一个统一格式可以获得最大的灵活性。

3. 决定如何实现每个管道连接,决定过滤器作为主动组件还是被动组件实现;过滤器间最好不要直接调用(不易变动)。 推荐方案:同步化相邻主动过滤器的分离管道机制(如果所有的管道石油相同的机制,过滤器的任意重组是可能的) 统一可以考虑实现操作系统的通信服务,如队列和管道等。也可以将过滤器按照独立线程实现,管道作为队列来使数据的生产者和消费者同步。

4. 设计和实现过滤器。考虑数据拷贝的性能需求、考虑缓冲区大小、过滤器的重用需求。

5. 设计出错处理。流水线组件不能共享任何全局状态,很难做错误处理,但是至少要支持错误探测。

6. 建立处理流水线

变体:

准备并加入流水线系统:过滤器可以有不止一个输入和不足一个输出,处理过程可以用一个有向图来建立(可以包含反馈系统)。

效果:

优点:

1. 消除了中间文件的需要,但是仍然允许在流水线中使用T形连接来研究中间数据

2. 通过过滤器交换增加灵活性

3. 通过重组增加灵活性

4. 过滤器组件的重组

5. 流水线的快速原型

6. 并行处理提高效率(并行开启主动过滤器)

缺点:

1. 共享状态信息或者昂贵或者不灵活(处理阶段如果需要共享大量的全局数据会非常昂贵)

2. 并行处理获得的效率往往是一种假象:过滤器件传输数据的代价大于单个过滤器负担计算的代价,以下过滤器在产生输出前消耗所有输入;线程或进程之间的关联转换在单处理器机器上通常比较昂贵;过滤器对管道的同步化可能经常启动或者终止过滤器,尤其是缓冲区较小时

3. 数据转换的额外开销:对于所有的过滤器输入和输出使用单数据类型获得的高度灵活性导致数据转换的额外开销。

4. 错误处理:如果流水线在关键任务中使用且不可能重启流水线或者忽略错误是需要考试使用其他的体系结构来构建

与层模式的比较:

层:更适合需要可靠操作的系统,因为更容易实现错误处理;

管道和过滤器:对于组件易于重组和重用。

黑板

语境:一个不成熟的领域,其中没有相近的已知方法或可行的方法

问题:黑板模式针对那些把原始数据转换成高层数据结构(如图 表 或者英语短语等)方面没有可行的确定的求解方法的问题例如:视觉、图像识别、语音识别等领域。

一般来说这类问题一般有以下条件

1. 在合理的视觉内,解空间的完全搜索是不可行的

2. 由于领域还不成熟,所以你需要有对同一个子任务进行不同算法的试验,由于这个原因,单个模块应该是易于替换的

3. 可以求求解部分问题不同的算法

4. 输入,涉及中间环节和最终结果有不同的表示,并且算法依据不同的范例来实现

5. 一个算法的输入往往是其他算法的输出

6. 不确定数据和近似解也包含在内

7. 使用不相关算法引起的潜在的平行性。

解决方案:

黑板体系结果背后的思想是合作分工于一个公共数据结构上的独立程序集。每个程序专门用来解决整个任务中的一个特定部分,所有的程序一起工作以解决问题,这些程序彼此独立,它们彼此不相互调用,它们的活动也没有预先确定顺序。

结构:

把系统分成一个叫做黑板的组件和一个控制组件,黑板组件由知识集合构成。

黑板的中心为数据仓库,解空间的元素和控制数据都保存在这里,黑板提供一个接口使所有的知识源能有它读出和写到它上面去。

解空间的所有元素都能出现在黑板上。

知识源是指求解整个问题特定方面的分离的独立子系统,它们一起模拟了整个问题领域。它们中没有那个能单独解决系统的任务,只有通过集成几个知识源的结构才能创建一个求解方案。

知识源之间不直接交流,它们只是从黑板读或者写,

控制组件运行一个循环来监视黑板上的改动并决定接下来采取什么动作,它根据一个知识应用策略来安排知识源的评估和行动,这种策略的基础是黑板上的数据

策略可以依赖控制知识源。这些特殊的知识源不必直接对黑板上的解法有用,但是执行做出控制决定所基于的计算。

一旦找到一个可接受的加速或者系统的空间资源或时间资源被耗尽,则系统停止。

黑板体系结构三个组件间的关系:黑板组件定义了两个过程inspect和update,知识源调用inspect并检查黑板上的当前解,update用于改动黑板上的数据,控制组件运行一个循环来监视黑板上的改动并决定接下来采取什么动作nextsource。

动态特性

1. 启动控制组件的主循环

2. 控制组件调用nextsource过程来选择下一个知识源

3. nextsource通过观察黑板首先确定那个知识源是潜在的贡献者

4. nextsource唤醒每个候选知识源的条件部分

5. 控制组件选择一个知识源到好状态(ok),并选择一个假设或一个假设集作为工作的基础(也可以是控制数据)。把知识源的动作部分应用于假设,

实现:

1. 定义问题 1)详细指出问题领域和找到一个解决方案所需知识的一般领域

2) 详细检查系统的输入,确定输入的任何特殊属性

3) 定义系统的输出,详细指明正确需求和失败

4) 喜欢用户和系统的交互

2. 定义问题的解空间 1)准确指出是什么构成了顶层解决方案

2)列出解决方案的不同抽象等级

3)将解决方案有序的放入一个或多个抽象层次中

4)找出能独立工作的完整解的细分

1. 将求解过程分为几个步骤 1)定义解是如何转换为更高等级的解决方案的

2)描述在同一抽象等级上如何预测假设

3)细化如何通过找出其他等级中对它们的支持来验证预测的假设

4)详细指明可以用于排除部分解空间的知识类型

2. 把知识分层与一定子任务相关联的专门知识。知识源必须是完整的:对应绝大多数输入短语,至少存在一个知识源动作的可能序列,它能够导出一个可以接受的解。

3. 定义黑板的词汇:必须是控制组件能够理解的内容,但是由于需要和知识源控制组件以前进化,所有涉及过程中部分时间点,词汇必须稳定。

4. 指出系统的控制:可以参考策略模式,系统设计最困难部分,常用的气氛式例子

1)以优先顺序排列可应用的知识源 2)提出低等级和高等级假设 3)提出覆盖问题大部分的假设 4)孤立体驱动。

5. 实现知识源。

变体:

产生式系统

仓库 传统的数据库(无控制组件,由外部控制)

扫描器

语法分析器

代码生成器

效果:

可以解决大部强制条件问题

1)试验,如果在领域中没有独立方法存在,而且对解空间的完全搜索也不可行是,黑板模式可以试验不同的可能算法进行试验,并也允许试用不同的控制启发方法

2)对可更改性和可维护性的支持;对于单个知识源,控制算法和中心数据结构被严格分离,所有的模块只能通过黑板通信

3)可重用的知识源 知识源是某类任务的专家,黑板体系结构有助于使它们重用。

4)支持容错性和健壮性 所有的结果都是假设,只有被数据和其他假设强烈才能生存,提供了对噪声数据和不确定结论的容忍。

缺点:

1)测试困难

2)不能保证有好的求解方案 一个黑板系统往往只能正确解决所给任务的某一百分比

3)难以建立一个好的控制策略 控制策略一般不能直接设计 需要试验

4)低效 拒绝错误假设需要承受多余的计算开销

5)昂贵的开发工作

6)缺少对并行机制的支持。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: