概念
层次系统组织成一个层次结构,每一层为上层服务(被上层调用),并作为下层客户(调用下层)。在一些层次系统中,除了一些精心挑选的输出函数外,内部的层只对相邻的层可见。这样的系统中构件在一些层实现了虚拟机(在另一些层次系统中层时部分不透明的),绝大部分是透明的,不需要知道底层是怎么来实现的。
如:手机及其App,App不需考虑通讯中的物理层是通过什么连进来的。
连接件通过决定层间如何交互的协议来定义,拓扑约束包括对相邻层间交互的约束。
这种风格支持基于可增加抽象层的设计。这样,允许将一个复杂问题分解成一个增量步骤序列的实现。由于每一层最多只影响两层(所以修改变动可以局部化,让系统更容易修改),同时只要给相邻层提供相同的接口,允许每层用不同的方法实现,同样为软件重用提供了强大的支持。
如:送餐机器人;可以分:传感器层、信号翻译层等,使问题更明确更容易分工实现。网络的分层TCP/IP协议、Linux kernel map、OS、各层API。
层次风格示意图
从示意图可以知道,层次结构大致分为层次分明型如B/S、C/S、MVC、MVP和层次依赖型如SOA依赖消息总线、C2逐层依赖,两种类型模型可以结合使用
SOA模型
SOA 是一种在计算环境中设计、开发、部署和管理离散逻辑单元(服务)模型的方法。
SOA 设计原则:
(1)明确定义的接口。服务请求者依赖于服务规约来调用服务,因此,服务定义必须长时间稳定,一旦公布,不能随意更改;服务的定义应尽可能明确,减少请求者的不适当使用;不要让请求者看到服务内部的私有数据。
(2)自包含和模块化。服务封装了那些在业务上稳定、重复出现的活动和构件,实现服务的功能实体是完全独立自主的,独立进行部署、版本控制、自我管理和恢复。
(3)粗粒度。服务数量不应该太多,依靠消息交互而不是远程过程调用,通常消息量比较大,但是服务之间的交互频度较低。
(4)松耦合。服务请求者可见的是服务的接口,其位置、实现技术、当前状态和私有数据等,对服务请求者而言是不可见的。
(5)互操作性、兼容和策略声明。为了确保服务规约的全面和明确,策略成为一个越来越重要的方面。
C2模型
C2是一种基于构件和消息的架构风格,可用于创建灵活的、可伸缩的软件系统。一个C2构架可以看成是按照一定规则由连接件连接的许多组件组成的层次网络:系统中的构件和连接件都有一个“顶部”和“底部”;一个构件的“顶部”或“底部”可以连接到一个连接件的“底部”或“顶部”;对于一个连接件,和其相连的构件或连接件的数量没有限制,但是构件和构件之间不能直接相连。
C2风格具有以下特点: (1)系统中的构件可实现应用需求,并能将任意复杂度的功能封装在一起;(2)所有构件之间的通讯是通过以连接件为中介的异步消息交换机制来实现的; (3)构件相对独立,构件之间依赖性较少。系统中不存在某些构件将在同一地址空间内执行,或某些构件共享特定控制线程之类的相关性假设
C2架构风格最重要的特性就是“底层无关性”,这在构件的可替代性和可重用性方面具有显著的作用;另外,C2架构引入了“事件转化”的概念,域解释器把构件的请求转化为接收方能够接收的特定形式,同时也把通知转化为该构件能够理解的形式。
层次风格总结
1.构件:各个子层(一层代码,抽象级别)
2.连接件:相邻子层之间的调用关系(交互协议)(连接件的表现形式也可千差万别)
3.规则:一般的讲,一个子层只能与相邻的层交互,不能跨层交互。如:Linux中 System Call 跨层调用CPU的system_call。
分层风格优点
1.支持基于抽象程度递增的系统设计,使设计者可以把一个复杂系统按递增的步骤进行分解;
2.支持功能增强。因为每一层之多和相邻的上下层交互,因此功能的改变最多影响相邻的上下层。
3.支持重用。只要提供服务的接口定义不变,同一层的不同实现可以交换使用。这样,就可以定义一组标准的接口,而允许各种不同的实现方式。
分层风格缺点
1.并不是每个系统都可以很容易的划分为分层的模式。
2.很难找到一个合适的、正确的层次抽象方法(分几层?无标准解)。
3.多层之间调用的性能不足。