软件体系结构的层次可分为
高:体系结构模式。明确一个应用的基本结构。
中:设计模式。描述通信组件的公共再现结构,通信组件可以解决特定语境中的一般设计问题。独立于特定语言。
低:惯用法。使用特定语言来实现组件的特殊方面。比如C++使用引用-计数方法来管理动态分配的资源。
设计模式与面向对象
许多模式使用了继承和多态等面向对象技术。比如策略,代理。但是另一方面,面向对象特征对于设计模式来说并不是最重要的。在C中实现策略模式可以使用函数指针来代替多态和继承。
在设计层次,大部分模式只需要适当的编程语言的抽象机制,如模块或数据抽象。
体系结构模式
模式系统中的最高等级。常见的8种体系结构模式:
层,管道和过滤器,黑板,代理者,MVC,PAC(表示-抽象-控制),微内核,映像。
这8种体系结构模式可分为4种类型:
从混沌到结构:有助于避免组件的海洋。以可控方式分解系统任务。如层,管道-过滤器,黑板。
分布式系统:代理者模式。
交互系统:MVC,表示-抽象-控制。
适应性系统:微内核,映像。
层
网络协议是最好的例子。层带来的好处是支持增量编码和测试,使用半独立部件,可以比较简单地重写代码边界。通常用顺序图描述。
层模式的主要结构特征是某一层功能只被其相邻的上层使用。类似于洋葱。
自顶向下通信(请求)的特点是某一层把上一层的请求分解成几个请求发给下一层。
自底向上通信(通知)是几个通知可以合并成1个结构更高的通知,或者保持1:1的关系。
一个高层请求可能到达某一中间层就可以了,无需发到最底层,也无需从本地发到远端。这样的层是有状态的缓冲层。相对地,无状态的层有简化程序的优点。
著名的“协议堆栈”的概念
层的优点:层的重用。可替代性。
层的缺点:降低效率,层的粒度难以认可,更改行为的重叠。
管道和过滤器
最常用于处理数据流系统。
层比较适用于需要可靠操作的系统,比管道和过滤器模式更容易实现错误处理。但是层缺少对组件的易于重组/重用的支持,而这是管道和过滤器模式的主要特征。
黑板
黑板对于无确定性求解策略的问题比较适用。比如语音识别等。
黑板体系结构背后的思想是合作工作与一个公共数据结构上的程序集。每个程序用来解决任务的一个特定部分。所有程序彼此独立,彼此不相互调用,一起工作已解决问题。系统的执行方向由前进的当前状态决定。
再谈分布式系统。
分布式系统的优点包括可扩展性,容错性等.
有3种模式跟分布式系统有关, 管道和过滤器,微内核,代理者等.
微内核的设计考虑了适应性.遵从CS体系结构.把最小功能核心同扩展功能以及客户机部分分离开.
微内核模式定义了5种参与组件:内部服务器,外部服务器,适配器,客户机,微内核.
微内核是主要组件,实现了通信和资源/设备处理等主要任务.设计目标之一是使微内核足够小以减少内存需求
内部服务器扩展了微内核的功能,微内核通过服务请求调用内部服务器的功能.内部服务器可以封装某些基本的硬件或软件系统上的附着物.比如,支持特定图形卡的驱动就是内部服务器的好的候选.内部服务器只能被微内核访问(激活或加载).
外部服务器(个性化服务器)使用微内核实现以应用领域为基础的视图.每个外部服务器都是一个进程,服务的实现依赖于微内核,需要访问微内核的编程API.借助微内核提供的通信手段接收客户机来的请求,执行相应服务,并返还结果给客户机.
适配器向客户机提供被转发给外部服务器的操作.当客户调用外部服务器的一个功能时,适配器把所有相关信息打包成一个请求转发给外部服务器.适配器通常设计成库,被动态链接到客户机.
代理者用于构建带有隔离组建的分布式系统,该组件通过远程服务调用RPC进行交互.代理者组件负责协调通信.
我们希望系统能不断生长和改变,所以希望单个服务之间彼此隔离.通过引入代理者模式,应用程序可以简单地向合适的对象发出消息调用访问分布式服务,而不是把重点放在低级通信上.分布性对开发者变得透明了,从而降低了开发分布式程序的复杂度.
代理者体系结构模式包括6种参与组件:客户机,服务器,代理者,桥接,客户机代理,服务器代理.
代理者体系结构模式的缺点: 效率受限; 容错性较差(可通过组件复制来提高);
设计模式描述通信组建的一种通用-重现结构.
八种设计模式:整体-局部,主控-从属,代理,命令处理器,视图处理器,接收器-转发器,客户机-分配器-服务器,出版者-订阅者.
整体-局部的典型例子是组合,实现聚合对象.
主控-从属采用"分而治之"的策略.
代理是为了提高效率,易于存取和安全控制等.
命令处理器将服务的请求和执行分开了.
转发器-接收器为对等体提供了进程间通信.
客户机-分配器-服务器在C/S之间引入了一个中间层--分配器.借助名字服务,实现位置透明性.并隐藏C/S之间通信的细节.
出版者-订阅者保持合作组件状态的同步化."推-拉"模式的实践.
惯用法
哪里能发现惯用法呢?在一门语言的导言部分,要好好阅读.
单件
C++ singleton的实现:
class Singleton{
static Singleton *theInstance;
Singleton();
public:
static Singleton *theInstance(){
if(!theInstance){
theInstance = new Singleton();
}
return theInstance;
}
}
Singleton *Singleton::theInstance = 0;
计数指针
动态内存管理
阅读(866) | 评论(0) | 转发(0) |