软件体系结构与设计模式

一.组成

软件体系结构 = 组件 + 连接件 + 约束
其中 组件为构成元素 连接件为交互机制 约束为拓扑结构
  • 组件:系统的逻辑或功能单元 可复用
组件可以被拆分为更小的单元或组件
组件是抽象的
组件提供特定的职责
  • 连接件:组件之间的交互规则或机制
  • 约束:组件和连接件的拓扑逻辑
框架和架构:
  1. 框架是架构的实现
  2. 架构是抽象方案 框架是半成品
  3. 架构层次隐藏所有实现细节 必须支持系统的功能性需求和质量属性

二.软件体系结构风格

描述特定领域中软件系统家族的组织方式的惯用模式,反映了领域中众多系统所共有的结构和语义特性,并指导如何将各个模块和子系统有效地组织成一个完整的系统

1.数据流风格

处理:数据到达即被激活   特点:无数据不工作

基本构件:数据处理   构件接口:输入和输出端口

连接件:数据流  接口角色:reader和writer          单向 异步 有缓冲


批处理

基本构件:独立的应用程序

连接件:某种类型的媒质

连接件定义了相应的数据流图 表示拓扑结构

定义:

每个步骤是一个独立的程序

每一步必须在前一步结束后才能开始 

数据必须是完整的 以整体的方式传递

管道-过滤器

数据源源不断的产生,系统需要对这些数据进行若干处理

构件:过滤器,处理数据流

连接件:管道,连接一个源和一个目的的过滤器

收集后立即处理

特点

  • 构件具有良好的隐蔽性和高内聚、低耦合的特点
  • 支持软件复用
  • 系统维护和增强系统性能简单
  • 支持并行执行
  • 允许对一些如吞吐量、死锁等属性的分析

缺点:性能不高 交互差

2.调用/返回风格

分而治之

每个软件构件 都设计为有一个 唯一 程序执行起点 和一个唯一的 程序执行终

程序构件通常叫做 子程序            从一个构件到另外一个 构件的控制传递叫做 子程序调用

主程序-子程序风格

系统模型 :调用和定义层次结构,子系统通常通过模块化定义
组件 :过程和显式可见数据
连接器 :过程调用和显式数据共享
控制结构 :单线程

存在如下问题:功能演化困难 现实中的系统功能不容易描述 功能化设计丢掉了数据与数据结构 可复用的代码较少

面向对象风格

封装 交互 继承 多态 复用和维护

缺点:占用内存大

系统模型 :本地化状态维护
组件 :对象
连接器 :过程调用
控制结构 :单线程

层次风格

系统模型: 不透明的层次结构
组件: 通常是功能的集合,提供支持
连接件: 过程调用
控制结构: 单线程

如C/S B/S

3.以数据为中心风格

以数据为中心的体系结构风格涉及一种 共享数据源 信息传递方式
在共享区域内存储数据,在存储区外,有许多构件可以访问修改数据

仓库体系风格

仓库是存储和维护数据的中心场所
连接件:仓库与独立构件之间的交互
经典应用: 数据库
实例:Eclipse

优势:降低了业务逻辑与数据访问逻辑之间的耦合度

黑板体系结构风格

三个主要组成部分是知识源、黑板和控制器

知识源:相互独立,通过黑板进行通讯,合作求解,通常为 条件-动作 的模式

控制器:时刻监视、满足条件就触发知识源来对黑板更新结果

黑板:保存求解状态

黑板模型求解问题的 推理机构 ,由监督程序和调度程序组成

典型应用:自然语言处理、语音处理、模式识别、图像处理

优点:知识源可以重用、方便添加新数据、具有容错性和健壮性

缺点:开销大、黑板的数据结构修改困难

4.虚拟机风格

一次书写、多次运行

解释器风格

解释器是一个用来执行其他程序的程序  针对不同硬件平台实现了一个虚拟机

用来消除程序语言与硬件之间存在的语义差异

定义:程序语言定义的计算 与 有效硬件操作确定的运算之间建立对应和联系

组件:解释器引擎、存储区

连接件:对存储区的数据访问

应用:各类语言环境、Internet浏览器、数据分析与转换;HTML、Maltab、SQL解释器、各种通信协议

基于规则风格

核心思想:将业务逻辑中可能频繁发生变化的代码从源代码中分离

5.独立构件

包括进程通讯和事件系统(隐式调用)

独立构件风格主要强调系统中的每个构件都是相对独立的个体,它们之间不直接通信,以降低耦合度,提升灵活性

事件

能够激活对象的功能

事件系统-隐式调用

基本构件:函数、事件

事件源:一个组件可以广播一些事件

事件处理器:系统中的其它构件可以注册自己感兴趣的事件,并将自己的某个过程与相应的事件进行关联

事件管理器:当一个事件被发布,系统自动调用在该事件中注册的所有过程

连接机制:过程<事件处理器> 向 特定的事件进行注册 

                  构件<事件源>发布事件

                 事件被发布时,向其注册的过程被隐式调用 调用次序不确定

调度机制:

在某些情况下,一个事件也可能触发其他事件,形成事件链

各个构件之间彼此无连接关系 相互独立

应用案例

优点:事件源和事件处理器解耦  可重用

缺点:事件管理器很难对大量的事件源输入做出及时响应(尤其是并发输出)   故障危害大

三.软件体系结构与建模(UML类图)

1.概念

软件体系结构由一定形式的结构化元素组成,是构件的集合,是系统和开发系统项目的蓝图

2.建立描述文档的原则

  1. 从读者的角度写
  2. 避免重复
  3. 避免歧义
  4. 使用标准组织结构
  5. 记录理由
  6. 有限的稳定性
  7. 审查文档是否符合需求

3.建模的4+1视图

逻辑视图: 支持行为要求 。 关键抽象,是对象或对象类。通常包括类图,对象图,状态图、序列图、协作图
过程视图: 解决并发和分发 。 将线程映射到对象。通常包含包图和组件图
开发视图: 组织 软件模块,库,子系统,开发单元。包含活动图
物理视图:将其他元素映射到 处理 通信节点 。包含部署图
场景视图:将其他视图映射到重要的 用例 包含用例图

4.UML

1.用例图

显示角色和系统提供的用例之间的关系

2.对象图

对象图是类图的一个实例,是系统在某个时间点的详细状态的快照

3.状态图

状态机图对一个单独对象的行为建模,指明对象在它的整个生命周期里,响应不同事件时,执行相关事件的顺序

4.协作(通信)图

描述了收发消息的对象的组织关系,强调对象之间的合作关系而不是时间顺序

5.序列图

序列图根据时间序列展示对象如何进行协作

6. 活动图

描述满足用例要求所要进行的活动以及活动间的约束关系

7.包图

系统在包层面上的结构设计 类似于文件夹的符号表示的模型元素的组合

8.组件图

系统中组件提供的、需要的接口、端口等,以及它们之间的关系

9.部署图

定义系统中软硬件的物理体系结构

10.复合结构

分层地将类分解为内部结构 将一个复杂的对象分解为多个部分

11.交互概述图

活动图和序列图的结合 可以将其视为活动图  
其中将活动替换为小的顺序图,或者将其视为用活动图表示法分解以显示控制流的顺序图

12.定时图

交互图的另一种形式 重点在于时序约束 
针对单个对象或多个对象描述

13.类图

类图是一种静态的结构图,描述了系统的类的集合,类的属性和类之间的关系,可以简化了人们对系统的理解

用法

1.具体类

属性的完整表示方式是: 可见性 名称 :类型 [ = 缺省值]
方法的完整表示方式是: 可见性 名称(参数列表) [ : 返回类型]

参数列表可不写

2.抽象类

抽象类的类名以及抽象方法的名字都用斜体字表示

3.接口

接口在类图中的第一层顶端用构造型 <>表示

关系

1.关联

对象和对象之间的连接

  • 如果一个对象的类代码中,包含有另一个对象的引用,那么这两个对象之间就是关联关系
  • 指向被引用的对象

2.聚合

整体与部分的拥有关系  但是成员对象可以脱离整体对象而独立存在

空心菱形在整体一方,箭头指向部分一方

3.组合

整体与部分是不可分的  强聚合

组合关系用实心菱形加实线箭头表示,实心菱形在整体一方,箭头指向部分一方

4.依赖

如果对象A用到对象B,但是和B的关系不是太明显的时候,就可以把这种关系看作是依赖关系

依赖关系用一个带虚线的箭头表示,由使用方指向被使用方,表示使用方对象持有被使用方对象的引用

5.泛化(继承)

泛化关系用空心三角和实线组成的箭头表示,从子类指向父类

6.实现

类实现接口

实现关系用空心三角和虚线组成的箭头来表示,从实现类指向接口

四.软件设计模式

面向对象七大原则

1.开闭原则OCP

对扩展开放 对修改关闭

抽象约束、封装变化
优点:可复用性高 可维护性高
2.里氏替换原则
继承必须确保超类所拥有的性质在子类中仍然成立

子类可以扩展父类的功能 但不能改变父类功能

优点:克服重写父类造成的可用性变差  动作正确性保证  是实现开闭原则的重要方式之一

3.依赖倒置原则

高层模块不依赖底层 而都应依赖抽象

抽象不依赖细节 细节应依赖抽象

核心:面向接口编程

好处:降低类间耦合  提高系统稳定性  减少并行开发风险  提高代码可读性

4.单一职责原则

一个类应该有且仅有一个引起它变化的原因 否则拆分

5.接口隔离原则ISP

客户端不应被迫依赖于它不使用的方法

优点:提高系统内聚性 保证系统稳定 减少代码冗余

例子、学生成绩管理程序一般包含插入成绩、删除成绩、修改成绩、计算总分、计算均分、打印成绩信息、查询成绩信息等功能,如果将这些功能全部放到一个接口中显然不太合理, 正确的做法是将它们分别放在输入模块、统计模块和打印模块等3个模块中

6.迪米特法则(最少知识原则)

只与你的直接朋友交谈 不和陌生人说话 

“朋友”是指: 当前对象本身 当前对象的成员对象 当前对象所创建的对象 当前对象的方法参数

优点:降低了类之间的耦合度 提高了类的可复用性和系统的扩展性

7.合成复用原则(组合/聚合复用原则)

要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现
如果要使用继承关系,则必须遵循里氏代换原则

优点:维持了类的封装性  新旧类之间的耦合度低  复用灵活性高

23种设计模式

创建型模式

用于描述“怎样创建对象“、特点是”将对象的创建与使用分离

工厂模式用来解耦

简单工厂模式

角色:抽象产品、具体产品、具体工厂

缺点:违反开闭原则

优点:易拓展、新产品直接修改工厂类

违反了开闭原则

工厂方法模式

角色:抽象工厂、具体工厂、抽象产品、具体产品

抽象工厂模式

主要角色:抽象工厂、具体工厂、抽象产品、具体产品

单例模式

该类负责创建自己的对象、同时确保只有单个对象被创建

饿汉式:类加载就会导致该单实例对象被创建

懒汉式:首次使用对象时才会创建

建造者模式

主要角色:抽象建造者、具体建造者、产品类、指挥者类

原型模式

主要角色:抽象原型、具体原型、访问类

结构型模式

用于描述将类或对象按某种布局组成更大的结构

适配器模式

主要角色:目标接口、适配者类、适配器类

装饰器模式

主要角色:抽象构建、具体构件、抽象装饰、具体装饰

代理模式

主要角色:抽象主题类、真实主题类、代理类

外观模式

迪米特法则典型应用

主要角色:外观角色、子系统角色

桥接模式

主要角色:抽象化角色、扩展抽象化角色、实现化角色、具体实现化角色

组合模式

主要角色:抽象根节点、树枝节点、叶子节点

享元模式

主要角色:抽象享元、具体享元、非享元、享元工厂

行为型模式

描述类和对象怎样共同协作、怎样分配职责

策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、

解释器模式:抽象表达式角色、终结符表达式、非终结符表达式、环境角色、客户端

五.质量属性

1.可用性
   关注点: 故障
提升可用性:
故障检测:ping、心跳、抛出异常
故障恢复:投票、冗余、内侧、回滚
故障避免:下线、事务、进程监控
2.可修改性
   关注点:修改成本
提升可修改性:
限制修改范围:各种设计模式
延迟绑定时间:配置文件、多态
3.性能
   关注点:处理响应的速度
提升性能:
资源的需求:提高效率、减少数据量、限制时间和处理对列长度
资源的管理:并发、增加资源
资源的仲裁:先来先服务、固定优先级、不饿死、最早Dealine优先
4.安全性
   关注点:尽量避免攻击对系统的影响
提升安全性:
抵抗攻击:用户实证、授权、保密传输、数据完整、减少暴露、限制访问
从攻击中恢复:恢复状态、攻击者识别
5.可测试性
   关注点:让bug容易被测试出来
一般软件项目40%的成本都在测试上
提升可测试性:
黑盒
白盒
6.易用性

   关注点:让用户“用的舒服“

提升易用性:

运行时策略

设计时策略

上篇:软件设计模式例子代码  【例2.2】简单工厂方法模式-汽车保险  【例2.3】工厂方法模式-汽车保险  【例2.4】抽象工厂模式-房屋信息  【例2.5】生成器模式-房屋信息  【例2.6】单例模式-互联网连接  【例3.2】组合模式-五子棋代码  【例3.3】组合模式-空军指挥系统  【例3.4】组合模式-世界问候语  【例3.7】类适配器模式-客户信息验证  【例3.8】对象适配器模式-字符串排序  【例3.10】外观模式-安全系统  【例3.11】外观模式-椭圆功能  【例3.13】桥接模式-茶水机系统  【例3.14】桥接模式-几何立体体积  【例4.1】迭代器模式-矩阵搜索  【例4.2】迭代器模式-产品搜索  【例4.4】访问者模式-名牌鞋销售软件  【例4.5】访问者模式-计算机部件销售软件  【例4.6】命令模式-室内温度控制  【例4.7】命令模式-室内温度控制-2个GUI  【例4.8】命令模式-室内温度控制-3个GUI  【例4.10】中介者模式-旅游信息共享  【例4.11】中介者模式-海岛机场  【例4.13】策略模式-整数排序  【例4.14】策略模式-中国属相  【例4.16】状态模式-交通信号灯-设计1  【例4.16】状态模式-交通灯信号灯-设计2  【例4.16】状态模式-交通灯信号灯-设计3 下篇:软件体系结构例子代码  【例6.4】结构化设计-文件更新-C源代码  【例6.5】面向对象设计架构-文件更新  【例6.7】顺序批处理架构-文件更新  【例6.8】顺序批处理架构-图像处理  【例6.9】管道过滤器架构-主动过滤器  【例6.10】管道过滤器架构-被动过滤器  【例6.11】管道-过滤器架构-文件更新  【例6.12】管道-过滤器架构-图像处理程  【例6.14】事件体系结构-鼠标响应  【例6.17】事件体系结构-观察者模式-大草原1  【例6.18】事件体系结构-观察者模式-大草原2  【例6.19】事件体系结构-观察者模式-温度显示  【例6.21】层次架构-软件测试  【例6.22】层次架构-银行- Access数据库  【例6.23】MVC架构-二手车拍卖-无观察者  【例6.24】MVC架构-二手车拍卖-观察者-3个图形界面  【例6.25】MVC架构-二手车拍卖-观察者-1个图形界面
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值