Version: Next
学习目标
- 理解与掌握面向对象的概念与方法
- 使用UML
- 完成面向对象的分析与设计工作
- 了解OO的设计原则及一些典型的设计模式
什么是面向对象
- 面向对象(Object-Orientation, OO)是一种系统建模技术
- 面向对象编程(OOP)是按照面向对象的方法来开发程序的过程
- 通过分析系统内对象的交互来描述或建模一个系统
- 交互的对象最终以类的形式组织
- OO的方法由三部分组成
- 过程
- 标识
- 规则
对象
- 是一个客观存在的、唯一的实体
- 是面向对象编程过程中分析和解决问题的出发点和基础
- 拥有自己的标识、数据与行为
- 可以简单或复杂
- 可以抽象或具体
- 在OOP种是一个类的动态实例
类
- 类是对象的模板
- 对象通过类实例化产生
- 一个类可以创建多个对象
OOAD(OO Analysis & Design)
OOAD是根据OO的方法,对软件系统进行分析和设计的过程
- OOA 分析阶段
- OOD 设计阶段
OOA
- 分析阶段主要解决一下问题
- 建立针对业务问题域的清晰视图
- 列出系统必须要完成的核心任务
- 针对问题域建立公共词汇表
- 列出针对此问题域的最佳解决方案
- 此阶段要解决的核心问题是"What to do"
OOD
- 设计阶段主要解决以下问题
- 如何解决具体的业务问题
- 引入系统工作所需的支持元素
- 定义系统的实现策略
- 此阶段要解决的核心问题是"How to do"
OOP的主要特征
- 抽象(Abstract) 忽略掉一个对象或实体的细节而只关注其本质特征的过程 简化功能与格式 帮助用户与对象交互
- 封装(Encapsulation) 隐藏数据和实现 提供公共方法供用户调用功能 对象的两种视图 外部视图:对象能做的工作 内部试图:对象如何完成工作
- 继承(Inheritance) 通常存在的类型定义新类型的机制 通常在两个类型之间存在"is a "或"kind of"这样的关系 通过继承可实现代码重用,另外继承也是多态的基础
- 多态(Polymorphism) 一个名称,多种形式 基于继承的多态 调用方法时根据所给对象的不同选择不同的处理方式
- 关联(Association) 对象之间交互时的一种引用方式 当一个对象通过另一个对象的引用去使用另一个对象的服务或操作时,两个对象之间便产生了关联
- 聚合(Aggregation) 关联关系的一种,一个对象称为另一个对象的组成部分 是一种关系较强的关联 在两个对象之间存在"has a"这样的关系,一个对象作为另一个对象的属性存在,在外部对象被生产时,可有客户端置顶与其关联的内部对象
- 组合(Composition) 当一个对象包含另一个对象,外部对象负责管理内部对象的生命周期的情况 关联关系中最强的一种 内部对象的创建由外部对象自己控制 外部对象不存在时,内部对象也不能存在
- 内聚和耦合(Cohesion & Coupling)
- 内聚:度量一个类独立完成某项工作的能力,功能要单一且强
- 耦合:度量系统内或系统之间依赖关系的复杂度
- 设计原则:增加内聚,减少耦合
域模型
- 域模型时面向对象的。在面向对象术语种,域模型也被称为设计模型。域模型由以下内容组成:
- 具有状态和行为的域对象
- 与对象之间的关系
- 关联
- 依赖
- 聚集
- 一般化(泛化)
域对象之间的关系
- 关联(Association) 一对多,多对一,多对多
- 依赖(Dependency) BusinessService类依赖Customer类,在BusinessService类种访问Customer类的方法,并且构造Customer类的实例
- 聚集(Aggregation) 指整体域部分之间的关系,在实体域对象之间很常见 Person类与Hand类之间的聚集关系
- 一般化(Generalization) 指类之间的继承关系
开发过程概述
- 传统开发过程
- 瀑布模型
- 需求
- 分析
- 设计
- 实现
- 测试
- 瀑布模型
- OOAD的开发过程
- 大项目分解为小项目
- 使用UML工具
- 统一软件开发过程时一个迭代、递增的开发过程
- 迭代、递增的项目生命周期
- 在每个迭代阶段,应该做以下工作
- 选择并分析相关用例
- 根据所选架构进行设计
- 在组件层次实现设计
- 验证组件满足用例的需要
- 当一次迭代满足目标后,开发进入下一个迭代周期
- 在每个迭代阶段,应该做以下工作
- 迭代、递增生命周期的优势
- 降低成本
- 便于更好的维护项目进度
- 便于团队的协作开发
- 便于适应用户需求的动态变化
初始化阶段
- 项目启动
- 建立业务模型
- 定义业务问题域
- 找出主要的风险因素
- 定义项目需求外延
- 创建业务问题域的相关说明文档
细化阶段
- 高层的分析与设计
- 建立项目的基础框架
- 监督主要的风险因素
- 置顶达成项目目标的创建计划
构建阶段
- 代码及功能的实现
移交阶段
- 向用户发布产品
- beta测试
- 执行性能调优,用户培训和接收测试
UML
Unified Modeling Language—— 统一建模语言。图形化的语言表示
- 描述UML在OOAD过程中的作用
- 熟悉UML中的九种基本图形(重点介绍三种)
- 用例图
- 类图
- 时序图
UML的定义
统一建模语言UML是一种图形化的语言,它可以帮助我们在OOAD过程中标识元素、构建模块、分析过程并可通过文档说明系统中的重要细节
UML图的分类
- 静态模型 Static Model
- 动态模型 Dynamic Model
静态建模
- 创建并记录一个系统的静态特征
- 反应一个软件系统基础、固定的框架结构
- 创建相关问题域主要元素的视图
- 静态建模包括
- 用例图(Use Case Diagrams)
- 类图(Class Diagrams)
- 对象图(Object Diagrams)
- 组件图(Component Diagrams)
- 部署图(Deployment Diagrams)
动态建模
- 动态建模用以展示系统的行为
- 动态建模包括:
- 时序图(Sequence Diagrams)
- 协作图(Collaboration Diagrams)
- 状态图(State Chart Diagrams)
- 活动图(Activity Diagrams)
其他重要的UML元素
- 包(Package)
- UML的扩展机制
- 注释(Comments)
- 构造型(Stereotypes)
- 标记值(Tagged Values)
- 限制(Constraints)
核心UML图
用例图(*)
展示系统的核心功能以与其交互的用户,用户被称为“活动者”(Actor)
用例使用椭圆表示(活动者能做什么事情)
为简化建模过程,用例图可标注优先级
实现
使用软件StarUML
放置Actor和Use case
类图(*)
- 表现类的特征
- 类图描述了多个类、接口的特征,以及对象之间的协作和交互
- 由一个或多个矩形区域构成,内容包括
- 类型(类名)
- 属性(可选)
- 方法(可选)
表示Reader要使用Book
语法:
- 属性
-name:int
方法
+changeString(name String): String
"-"表示private;"+"表示public,之后可以设置属性,和方法
表示HourlyEmployee 和 SalariedEmployee 继承自Employee
接口实现的表示
- ⚪表示接口
- 虚线箭头表示实现(Realization)
对象图
- 表示对象的特征
- 对象图展现了多个对象的特征及对象之间的交互
组件图
- 表现软件组件之间的关系
部署图
- 表现用于部署软件应用的物理设备信息
时序图(*)
- 捕捉一段时间范围内多个对象之间的交互信息
- 强调消息交互的时间顺序
- 上方矩形为对象
- 执行顺序从上到下(时间顺序)
- 横线表示调用,文字为方法名
- 横虚线表示返回return
协作图
- 表示一定范围内对象之间协作的信息
- 强调参与信息交流的对象之间的组织结构
显然不如直接用时序图
状态图
- 强调一个对象在不同事件触发时,其内部状态的转变过程
- 即,对象的生命周期
包
- 引用一组相关实体
- 通常可用于划分类的命名空间
- 包可用于
- 命名(Naming)
- 成员可见度(Member Visibility)
- 导入(Importing)
- 继承(Extending)
- 泛化(Generalization)
使用UML分析设计模式
- 23种设计模式皆可在StarUML中直接调出
- 支持通过UML图产生代码,包括Java, C, C++
- 支持通过代码反向生成UML图
单例模式
类图
观察者模式
类图
抽象主题角色
抽象观察者角色
↑ 继承自
具体主题角色
具体观察者角色
模板方法模式
- 父类角色:提供模板
- 子类角色:为模板提供实现
类图
组合模式
类图
- 最右边的线表示Composite可以包含多个Component
装饰模式
- 抽象构件角色(Component)
- 具体构件角色(Concrete Component)
- 装饰角色(Decorator) 持有一个构建(Component)对象的引用
- 具体装饰角色(Concrete Decorator)
类图
适配器角色
类图
代理模式
- 抽象角色:声名真实对象和代理对象的共同接口
- 代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他操作,相当于对真实对象进行封装
- 真实角色:代理角色所代表的真实对象,是我们最终要引用的对象