软件体系结构风格
◎ 很难找到一个合适的、正确的层次抽象方法。
实例: 操作系统、数据库系统、计算机网络协议组
数据共享风格也称为仓库风格,有两种不同类型的 软件元素:
一种是中央数据单元,也称为资源库,用于表示系统的当前 状态,另一种是相互依赖的构件组,中央数据单元和构件之 间可以进行信息交换,这是数据共享体系结构的技术实现基 础
软件框架设计的核心问题是:能否复用已经成型的 体系结构方案 不同系统的设计方案存在着许多共性问题,把这些 共性部分抽取出来,就形成了具有代表性的和可广 泛接受的体系结构风格
什么是软件体系结构风格? 软件体系结构风格是描述某一特定应用领域中系统组 织方式的惯用模式。 软件体系结构风格的作用是什么? 1.指导如何将各个模块和子系统有效地组织成一个完 整的系统。 2.有关风格的使用带来了设计者的交流形式。关于设 计元素的词汇促进了设计者理解和交流。 3.使用风格能够使代码的重用性得到提高。当用不同 的系统时,基本的架构代码风格不需要修改,它能够 用于不同的系统中。
特点: 1.每个构件都有输入输出,构件完成对输入数据的处 理产生输出。 2.构件之间相对独立,相互之间无交互状态,非邻近 过滤器不共享任何信息。 3.整个体系结构的最终输出与格构件执行的顺序无关。 词汇: 过滤器:构件 管道:连接
管道
过滤器
优点
◎使得软构件具有良好的隐蔽性和高内聚、低耦合的特点;
缺点:
◎如果一个对象要调用另一个对象,则必须知道它的标识和 名称 ◎会产生连锁反应,如果一个对象的标识发生改变,那么必 须修改所有显式调用它的其它对象,并消除由此引发的副作 用
构件不直接调用一个过程,而是触发或广播一 个或多个事件。系统中的其它构件中的过程在一 个或多个事件中注册,当一个事件被触发,系统 自动调用在这个事件中注册的所有过程,这样, 一个事件的触发就导致了另一模块中的过程的调 用。 特点: 1.构件是模块,模块可以是过程也可以是事件的集 合。 2.连接件:往往是以过程之间的隐式调用(Implicit
ks1
ks8
ks2 中央数据单元 ks3
ks7
ks6
ks4
ks5
根据所使用的控制策略不同,数据共享体系结构可 以分为两种类型:
一种是传统的数据库,另一种是黑板
如果由输入流中的事件来驱动系统进行信息处理, 把执行结果存储到中央数据单元中,则这个系统就 是数据库应用系统 如果由中央数据单元的当前状态来驱动系统运行, 则这个系统就是黑板应用系统
}
for(int i=0;i<ids.size();i++){ int id=list.get(i); Student s=dao.select(id); list.add(s); } return list;
优点 ◎支持基于抽象程度递增的系统设计,使设计者可以 把一个复杂系统按递增的步骤进行分解;
缺点 ◎ 通常导致进程成为批处理的结构。这是因为虽然过滤器 可增量式地处理数据,但它们是独立的,所以设计者必须将 每个过滤器看成一个完整的从输入到输出的转换。
◎ 不适合处理交互的应用。当需要增量地显示改变时,这 个问题尤为严重。
◎ 因为在数据传输上没有通用的标准,每个过滤器都增加 了解析和合成数据的工作,这样就导致了系统性能下降,并 增加了编写过滤器的复杂性。 ◎ 难以进行错误处理,管道 / 过滤器结构的固有特性,决定 了很难制定错误处理的一般性策略
用户系统 基本工具 核心层
过程调用
各种构件
public interface StudentDAO(){ List selectAll(){} Student Select(int id){} void update(Student s){} void delete(int id){} void add(Student s){} } public class StudentDAOImpl(){ ...... } public class StudentBusiness{ StudentDao dao; public Student(StudentDao dao){ this.dao=dao } public list studentChoice(List ids){ List list= new ArrayList();
◎ 允许设计者将整个系统的输入/输出行为看成是多个过滤器的行为的 简单合成;
◎ 支持软件重用。只要提供适合在两个过滤器之间传送的数据,任何 两个过滤器都可被连接起来;
◎ 系统维护和增强系统性能简单。新的过滤器可以添加到现有系统中 来;旧的可以被改进的过滤器替换掉; ◎ 允许对一些如吞吐量、死锁等属性的分析; ◎ 支持并行执行。每个过滤器是作为一个单独的任务完成,因此可与 其它任务并行执行。
◎ 支持功能增强,因为每一层至多和相邻的上下层 交互,因此功能的改变最多影响相邻的上下层; ◎ 支持重用。只要提供的服务接口定义不变,同一 层的不同实现可以交换使用。这样,就可以定义一组 标准的接口,而允许各种不同的实现方法。
缺点: ◎ 并不是每个系统都可以很容易地划分为分层的模 式,甚至即使一个系统的逻辑结构是层次化的,出于 对系统性能的考虑,系统设计师不得不把一些低级或 高级的功能综合起来;
3.有可重用的知识源:
◦ 由于每个知识源在黑板系统中都是独立的,如果知识源和 所基于的黑板系统有理解相同的协议和数据,我们就可以 重用知识源。
4.支持容错性和健壮性:
◦ 在黑板模式中所有的结果都是假设的,并且只有那些被数 据和其它假设强烈支持的才能够生存。这对于噪声数据和 不确定的结论有很强的容错性。
优点:
◎事件声明者不需要知道哪些构件会响应事件,因此,不能 确定构件处理的先后顺序,甚至不能确定事件会引发哪些过 程调用 ◎提高了软件复用能力,只要在系统事件中注册构件的过程, 就可以将该构件集成到系统中 ◎便于系统升级,只要构件名和事件中所注册的过程名保持 不变,原有构件就可以被新构件所替代
缺点: ◎ 构件放弃了对系统计算的控制。一个构件触发 一个事件时,不能确定其它构件是否会响应它。而 且即使它知道事件注册了哪些构件的构成,它也不 能保证这些过程被调用的顺序。
黑板模式对于无确定性求解策略的问题比较有用, 在专家系统中,这种模式应用的比较广泛。
例:问题:设字符转换规则 A∧B→C A∧C→D B∧C→G B∧E→F D→E 已知:A,B 求:F
一、综合数据库 {x},其中x为字符 二、规则集 1,IF A∧B THEN C 2,IF A∧C THEN D 3,IF B∧C THEN G 4,IF B∧E THEN F 5,IF D THEN E 三、控制策略 顺序排队 四、初始条件 {A,B} 五、结束条件 F∈{x}
Inபைடு நூலகம்ocation)来实现的
例:观察者模式
public interface Subject { public void attach (Observer observer); public void detach (Observer observer);
void notifyObservers(); }
◎ 数据交换的问题。有时数据可被一个事件传递, 但另一些情况下,基于事件的系统必须依靠一个共 享的仓库进行交互。在这些情况下,全局性能和资 源管理便成了问题
实例: 1.Debugger 2.在用户界面中分离数据和表示
特点: 分层系统采用多个层次组织,每一层必须起两个作用: (1)使用下层提供的功能。 (2)为上层提供服务。
public interface Observer { void update(); } public static void main(String args[]){ Subject s=new ConcreteSubject(); s.attach(new Observer(){ public void update(){ System.out.println("ok"); } }); s.notifyer(); }
实例: 传统的编译器是管道/过滤器体系结构风格的一个实例
源 程 序
词法分析
语法分析
语义分析
中间代码生成
中间代码优化
目标代码生成
目 标 程 序
这种风格建立在数据抽象和面向对象的基础上, 数据的表示方法和它们的相应操作封装在一个抽象 数据类型或对象中。 特点: 1.对象是构件。 2.在对象和对象之间,通过函数调用和过程调用来进 行交互。
public class ConcreteSubject implements Subject { public void attach(Observer observer) { observersVector.addElement(observer); }
public void detach(Observer observer) { observersVector.removeElement(observer); } public void notifyObservers() { Enumeration enumeration = observers(); while (enumeration.hasMoreElements()) { ((Observer)enumeration.nextElement()).update(); } } public Enumeration observers() { return ((Vector) observersVector.clone()).elements(); } private Vector observersVector = new java.util.Vector(); }