一.组成
- 组件:系统的逻辑或功能单元 可复用
- 连接件:组件之间的交互规则或机制
- 约束:组件和连接件的拓扑逻辑
- 框架是架构的实现
- 架构是抽象方案 框架是半成品
- 架构层次隐藏所有实现细节 必须支持系统的功能性需求和质量属性
二.软件体系结构风格
描述特定领域中软件系统家族的组织方式的惯用模式,反映了领域中众多系统所共有的结构和语义特性,并指导如何将各个模块和子系统有效地组织成一个完整的系统
1.数据流风格
处理:数据到达即被激活 特点:无数据不工作
基本构件:数据处理 构件接口:输入和输出端口
连接件:数据流 接口角色:reader和writer 单向 异步 有缓冲
批处理
基本构件:独立的应用程序
连接件:某种类型的媒质
连接件定义了相应的数据流图 表示拓扑结构
定义:
每个步骤是一个独立的程序
每一步必须在前一步结束后才能开始
数据必须是完整的 以整体的方式传递
管道-过滤器
数据源源不断的产生,系统需要对这些数据进行若干处理
构件:过滤器,处理数据流
连接件:管道,连接一个源和一个目的的过滤器
收集后立即处理
特点
- 构件具有良好的隐蔽性和高内聚、低耦合的特点
- 支持软件复用
- 系统维护和增强系统性能简单
- 支持并行执行
- 允许对一些如吞吐量、死锁等属性的分析
缺点:性能不高 交互差
2.调用/返回风格
分而治之
主程序-子程序风格
存在如下问题:功能演化困难 现实中的系统功能不容易描述 功能化设计丢掉了数据与数据结构 可复用的代码较少
面向对象风格
封装 交互 继承 多态 复用和维护
缺点:占用内存大
层次风格
如C/S B/S
3.以数据为中心风格
仓库体系风格
优势:降低了业务逻辑与数据访问逻辑之间的耦合度
黑板体系结构风格
三个主要组成部分是知识源、黑板和控制器
知识源:相互独立,通过黑板进行通讯,合作求解,通常为 条件-动作 的模式
控制器:时刻监视、满足条件就触发知识源来对黑板更新结果
黑板:保存求解状态
典型应用:自然语言处理、语音处理、模式识别、图像处理
优点:知识源可以重用、方便添加新数据、具有容错性和健壮性
缺点:开销大、黑板的数据结构修改困难
4.虚拟机风格
一次书写、多次运行
解释器风格
解释器是一个用来执行其他程序的程序 针对不同硬件平台实现了一个虚拟机
用来消除程序语言与硬件之间存在的语义差异
定义:程序语言定义的计算 与 有效硬件操作确定的运算之间建立对应和联系
组件:解释器引擎、存储区
连接件:对存储区的数据访问
应用:各类语言环境、Internet浏览器、数据分析与转换;HTML、Maltab、SQL解释器、各种通信协议
基于规则风格
核心思想:将业务逻辑中可能频繁发生变化的代码从源代码中分离
5.独立构件
包括进程通讯和事件系统(隐式调用)
独立构件风格主要强调系统中的每个构件都是相对独立的个体,它们之间不直接通信,以降低耦合度,提升灵活性
事件
能够激活对象的功能
事件系统-隐式调用
基本构件:函数、事件
事件源:一个组件可以广播一些事件
事件处理器:系统中的其它构件可以注册自己感兴趣的事件,并将自己的某个过程与相应的事件进行关联
事件管理器:当一个事件被发布,系统自动调用在该事件中注册的所有过程
连接机制:过程<事件处理器> 向 特定的事件进行注册
构件<事件源>发布事件
事件被发布时,向其注册的过程被隐式调用 调用次序不确定
调度机制:
在某些情况下,一个事件也可能触发其他事件,形成事件链
各个构件之间彼此无连接关系 相互独立
应用案例
优点:事件源和事件处理器解耦 可重用
缺点:事件管理器很难对大量的事件源输入做出及时响应(尤其是并发输出) 故障危害大
三.软件体系结构与建模(UML类图)
1.概念
软件体系结构由一定形式的结构化元素组成,是构件的集合,是系统和开发系统项目的蓝图
2.建立描述文档的原则
- 从读者的角度写
- 避免重复
- 避免歧义
- 使用标准组织结构
- 记录理由
- 有限的稳定性
- 审查文档是否符合需求
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
对扩展开放 对修改关闭
子类可以扩展父类的功能 但不能改变父类功能
优点:克服重写父类造成的可用性变差 动作正确性保证 是实现开闭原则的重要方式之一
3.依赖倒置原则
高层模块不依赖底层 而都应依赖抽象
抽象不依赖细节 细节应依赖抽象
核心:面向接口编程
好处:降低类间耦合 提高系统稳定性 减少并行开发风险 提高代码可读性
4.单一职责原则
一个类应该有且仅有一个引起它变化的原因 否则拆分
5.接口隔离原则ISP
客户端不应被迫依赖于它不使用的方法
优点:提高系统内聚性 保证系统稳定 减少代码冗余
6.迪米特法则(最少知识原则)
只与你的直接朋友交谈 不和陌生人说话
优点:降低了类之间的耦合度 提高了类的可复用性和系统的扩展性
7.合成复用原则(组合/聚合复用原则)
优点:维持了类的封装性 新旧类之间的耦合度低 复用灵活性高
23种设计模式
创建型模式
用于描述“怎样创建对象“、特点是”将对象的创建与使用分离“
工厂模式用来解耦
简单工厂模式
角色:抽象产品、具体产品、具体工厂
缺点:违反开闭原则
优点:易拓展、新产品直接修改工厂类
违反了开闭原则
工厂方法模式
角色:抽象工厂、具体工厂、抽象产品、具体产品
抽象工厂模式
主要角色:抽象工厂、具体工厂、抽象产品、具体产品
单例模式
该类负责创建自己的对象、同时确保只有单个对象被创建
饿汉式:类加载就会导致该单实例对象被创建
懒汉式:首次使用对象时才会创建
建造者模式
主要角色:抽象建造者、具体建造者、产品类、指挥者类
原型模式
主要角色:抽象原型、具体原型、访问类
结构型模式
用于描述将类或对象按某种布局组成更大的结构
适配器模式
主要角色:目标接口、适配者类、适配器类
装饰器模式
主要角色:抽象构建、具体构件、抽象装饰、具体装饰
代理模式
主要角色:抽象主题类、真实主题类、代理类
外观模式
迪米特法则典型应用
主要角色:外观角色、子系统角色
桥接模式
主要角色:抽象化角色、扩展抽象化角色、实现化角色、具体实现化角色
组合模式
主要角色:抽象根节点、树枝节点、叶子节点
享元模式
主要角色:抽象享元、具体享元、非享元、享元工厂
行为型模式
描述类和对象怎样共同协作、怎样分配职责
策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、
解释器模式:抽象表达式角色、终结符表达式、非终结符表达式、环境角色、客户端
五.质量属性
关注点:让用户“用的舒服“
提升易用性:
运行时策略
设计时策略