007-面向对象分析与设计
本文介绍了面向对象分析与设计(OOAD)的核心概念和方法。主要内容包括: 面向对象基础概念:详细阐述了封装、继承、多态和抽象四大特征,通过类图展示了对象间的关系。 面向对象分析(OOA):介绍了领域建模过程,包括概念类识别、属性确定和关联分析,以及用例分析方法。 可视化建模:使用Mermaid图表展示了面向过程与面向对象的区别、类层次结构、关联关系等核心概念。 文章采用技术文档的格式,通过定义、特
007-面向对象分析与设计
学习目标
通过本章学习,您将能够:
- 理解面向对象的基本概念和核心思想
- 掌握面向对象分析(OOA)的方法和技术
- 学会面向对象设计(OOD)的原则和模式
- 熟练使用UML进行系统建模
- 了解面向对象开发的最佳实践
- 具备分析和设计复杂系统的能力
- 理解设计模式的应用场景
1. 面向对象基础概念
1.1 面向对象思想
面向对象的核心思想
面向对象(Object-Oriented, OO)是一种程序设计范式,它将现实世界中的事物抽象为对象,通过对象之间的交互来解决问题。
面向对象vs面向过程
1.2 面向对象的基本特征
封装(Encapsulation)
封装的定义
将数据和操作数据的方法绑定在一起,隐藏对象的内部实现细节,只暴露必要的接口。
封装的优势
- 数据安全:保护对象内部状态
- 降低耦合:减少模块间依赖
- 提高复用:接口稳定,实现可变
- 便于维护:修改实现不影响使用者
classDiagram
class BankAccount {
-balance: double
-accountNumber: string
+deposit(amount: double)
+withdraw(amount: double)
+getBalance(): double
-validateAmount(amount: double)
}
note for BankAccount "私有属性和方法\n受到保护,只能\n通过公共接口访问"
继承(Inheritance)
继承的定义
子类可以继承父类的属性和方法,实现代码复用和层次化组织。
继承的类型
继承的优势与注意事项
- ✅ 代码复用,减少重复
- ✅ 建立类型层次,便于理解
- ✅ 支持多态性
- ⚠️ 避免过深的继承层次
- ⚠️ 遵循里氏替换原则
- ⚠️ 优先组合而非继承
多态(Polymorphism)
多态的定义
同一个接口可以有多种不同的实现,在运行时根据对象的实际类型调用相应的方法。
多态的实现方式
多态的优势
- 提高代码灵活性和可扩展性
- 降低模块间耦合度
- 支持开闭原则(对扩展开放,对修改关闭)
- 简化客户端代码
抽象(Abstraction)
抽象的层次
pyramid
title 抽象层次
"具体实现" : 100
"具体类" : 80
"抽象类" : 60
"接口" : 40
"概念模型" : 20
抽象的应用
- 抽象类:部分实现的类,不能直接实例化
- 接口:纯抽象的契约,定义行为规范
- 抽象方法:只有声明没有实现的方法
2. 面向对象分析(OOA)
2.1 OOA概述
面向对象分析的目标
- 理解问题域
- 识别关键对象和类
- 确定对象间的关系
- 建立概念模型
- 为设计阶段提供基础
OOA的主要活动
2.2 领域建模
概念类识别
识别概念类的方法
-
名词分析法
- 从需求描述中提取名词
- 分析名词的重要性和相关性
- 确定哪些名词应该成为类
-
常见概念类别
- 物理对象:书籍、设备、车辆
- 角色:用户、管理员、客户
- 事件:订单、交易、会议
- 交互:合同、协议、通信
- 规格说明:产品规格、服务标准
概念类图示例
属性识别
属性识别原则
- 属性应该是简单的数据值
- 属性在问题域中有意义
- 属性与当前系统相关
- 避免外键属性(用关联表示)
属性类型
- 基本属性:字符串、数字、日期、布尔值
- 枚举属性:状态、类型、级别
- 计算属性:年龄、总价、平均值
关联识别
关联类型
关联的多重性
1
: 恰好一个0..1
: 零个或一个*
或0..*
: 零个或多个1..*
: 一个或多个2..5
: 2到5个
2.3 用例分析
用例建模
用例图的组成
用例详细描述
用例描述模板
用例名称:借阅图书
用例编号:UC-001
主要参与者:读者
次要参与者:图书管理员
前置条件:
- 读者已登录系统
- 图书在库可借
- 读者借阅权限正常
主要流程:
1. 读者搜索并选择要借阅的图书
2. 系统检查图书可借状态
3. 系统检查读者借阅权限
4. 系统记录借阅信息
5. 系统更新图书状态为已借出
6. 系统生成借阅凭证
7. 系统发送借阅确认通知
异常流程:
2a. 图书不可借
2a1. 系统显示图书不可借原因
2a2. 用例结束
3a. 读者权限异常
3a1. 系统显示权限异常信息
3a2. 用例结束
后置条件:
- 借阅记录已创建
- 图书状态已更新
- 读者收到借阅确认
2.4 对象交互分析
时序图分析
协作图分析
协作图(通信图)展示对象间的静态关系和动态交互。
3. 面向对象设计(OOD)
3.1 OOD概述
面向对象设计的目标
- 将分析模型转换为设计模型
- 定义系统的软件架构
- 设计类的详细结构
- 定义对象间的交互机制
- 为实现阶段提供蓝图
OOD的设计层次
pyramid
title OOD设计层次
"实现设计" : 100
"详细设计" : 80
"类设计" : 60
"子系统设计" : 40
"架构设计" : 20
3.2 设计原则
SOLID原则
单一职责原则(SRP)
一个类应该只有一个引起它变化的原因。
开闭原则(OCP)
软件实体应该对扩展开放,对修改关闭。
classDiagram
class Shape {
<<abstract>>
+calculateArea()*
}
class AreaCalculator {
+calculateTotalArea(shapes: Shape[])
}
class Circle {
+radius: double
+calculateArea()
}
class Rectangle {
+width: double
+height: double
+calculateArea()
}
class Triangle {
+base: double
+height: double
+calculateArea()
}
Shape <|-- Circle
Shape <|-- Rectangle
Shape <|-- Triangle
AreaCalculator --> Shape
note for AreaCalculator "添加新形状不需要\n修改AreaCalculator"
里氏替换原则(LSP)
子类对象应该能够替换父类对象而不影响程序的正确性。
接口隔离原则(ISP)
客户端不应该依赖它不需要的接口。
依赖倒置原则(DIP)
高层模块不应该依赖低层模块,两者都应该依赖抽象。
其他重要设计原则
组合优于继承
迪米特法则(最少知识原则)
一个对象应该对其他对象有最少的了解。
3.3 设计模式
创建型模式
单例模式(Singleton)
classDiagram
class Singleton {
-instance: Singleton
-Singleton()
+getInstance(): Singleton
+doSomething()
}
note for Singleton "私有构造函数\n确保只有一个实例"
工厂方法模式(Factory Method)
结构型模式
适配器模式(Adapter)
装饰器模式(Decorator)
行为型模式
观察者模式(Observer)
策略模式(Strategy)
3.4 架构设计
分层架构
MVC架构模式
MVC组件职责
- Model(模型):管理数据和业务逻辑
- View(视图):负责数据的显示和用户界面
- Controller(控制器):处理用户输入,协调Model和View
4. UML建模详解
4.1 UML概述
UML图的分类
mindmap
root((UML图))
结构图
类图
对象图
组件图
部署图
包图
组合结构图
行为图
用例图
活动图
状态机图
时序图
通信图
交互概览图
时间图
4.2 结构图详解
类图(Class Diagram)
类图的基本元素
classDiagram
class ClassName {
<<stereotype>>
+publicAttribute: Type
#protectedAttribute: Type
-privateAttribute: Type
~packageAttribute: Type
+publicMethod(): ReturnType
#protectedMethod(): ReturnType
-privateMethod(): ReturnType
~packageMethod(): ReturnType
+abstractMethod()* ReturnType
+staticMethod()$ ReturnType
}
note for ClassName "可见性符号:\n+ public\n# protected\n- private\n~ package"
类之间的关系
组件图(Component Diagram)
部署图(Deployment Diagram)
4.3 行为图详解
活动图(Activity Diagram)
状态图(State Diagram)
5. 面向对象开发实践
5.1 分析设计过程
迭代式开发流程
5.2 设计质量评估
内聚性(Cohesion)
内聚性类型(从低到高)
耦合性(Coupling)
耦合性类型(从高到低)
5.3 重构技术
常见重构方法
提取方法(Extract Method)
// 重构前
class OrderProcessor {
public void processOrder(Order order) {
// 验证订单
if (order.getItems().isEmpty()) {
throw new IllegalArgumentException("订单不能为空");
}
if (order.getCustomer() == null) {
throw new IllegalArgumentException("客户信息不能为空");
}
// 计算总价
double total = 0;
for (OrderItem item : order.getItems()) {
total += item.getPrice() * item.getQuantity();
}
order.setTotal(total);
// 保存订单
database.save(order);
}
}
// 重构后
class OrderProcessor {
public void processOrder(Order order) {
validateOrder(order);
calculateTotal(order);
saveOrder(order);
}
private void validateOrder(Order order) {
if (order.getItems().isEmpty()) {
throw new IllegalArgumentException("订单不能为空");
}
if (order.getCustomer() == null) {
throw new IllegalArgumentException("客户信息不能为空");
}
}
private void calculateTotal(Order order) {
double total = 0;
for (OrderItem item : order.getItems()) {
total += item.getPrice() * item.getQuantity();
}
order.setTotal(total);
}
private void saveOrder(Order order) {
database.save(order);
}
}
提取类(Extract Class)
// 重构前
class Person {
private String name;
private String phoneNumber;
private String areaCode;
private String officeNumber;
public String getTelephoneNumber() {
return "(" + areaCode + ") " + phoneNumber;
}
public String getOfficeAreaCode() {
return areaCode;
}
public void setOfficeAreaCode(String areaCode) {
this.areaCode = areaCode;
}
public String getOfficeNumber() {
return officeNumber;
}
public void setOfficeNumber(String officeNumber) {
this.officeNumber = officeNumber;
}
}
// 重构后
class Person {
private String name;
private TelephoneNumber officeTelephone = new TelephoneNumber();
public String getTelephoneNumber() {
return officeTelephone.getTelephoneNumber();
}
public TelephoneNumber getOfficeTelephone() {
return officeTelephone;
}
}
class TelephoneNumber {
private String phoneNumber;
private String areaCode;
public String getTelephoneNumber() {
return "(" + areaCode + ") " + phoneNumber;
}
public String getAreaCode() {
return areaCode;
}
public void setAreaCode(String areaCode) {
this.areaCode = areaCode;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
}
6. 实践练习
练习1:图书管理系统OOA
需求描述
设计一个图书管理系统,支持图书借阅、归还、查询等功能。系统用户包括读者、图书管理员和系统管理员。
练习任务
- 进行领域建模,识别主要概念类
- 绘制完整的用例图
- 编写3个主要用例的详细描述
- 设计类图,包含属性和方法
- 绘制借书流程的时序图
练习2:在线购物系统OOD
场景描述
基于已有的需求分析,设计一个在线购物系统的详细设计。
练习任务
- 应用SOLID原则重新设计类结构
- 选择合适的设计模式解决以下问题:
- 支付方式的扩展(策略模式)
- 订单状态的管理(状态模式)
- 商品信息的缓存(单例模式)
- 设计系统的分层架构
- 绘制组件图和部署图
练习3:设计模式应用
练习任务
- 为日志系统设计单例模式实现
- 为文件处理系统设计工厂方法模式
- 为GUI组件设计装饰器模式
- 为事件处理设计观察者模式
- 分析每种模式的优缺点和适用场景
7. 考试重点
7.1 重要概念
面向对象基础
- 封装、继承、多态、抽象的概念和应用
- 类与对象的关系
- 接口与抽象类的区别
- 方法重载与重写的区别
设计原则
- SOLID原则的理解和应用
- 高内聚低耦合的设计思想
- 组合优于继承的原则
- 迪米特法则的应用
UML建模
- 各种UML图的用途和画法
- 类图中关系的表示方法
- 用例图的组成要素
- 时序图的交互表示
7.2 常考题型
选择题重点
- 面向对象特征的理解
- 设计原则的应用场景
- UML图的识别和理解
- 设计模式的分类和特点
设计题重点
- 根据需求设计类图
- 绘制用例图和时序图
- 应用设计模式解决问题
- 系统架构设计
案例分析题重点
- 分析设计的优缺点
- 识别设计中的问题
- 提出改进建议
- 评估设计质量
7.3 复习建议
理论学习
- 深入理解面向对象的核心思想
- 熟练掌握各种设计原则
- 理解常用设计模式的结构和应用
实践练习
- 多做UML建模练习
- 分析开源项目的设计
- 实现常用设计模式
- 进行代码重构练习
综合应用
- 结合实际项目进行设计
- 分析设计决策的权衡
- 评估设计的可维护性和可扩展性
总结
面向对象分析与设计是现代软件开发的核心方法论,通过本章学习,我们全面掌握了:
理论基础:深入理解了面向对象的四大特征,建立了完整的OO思维模式。
分析方法:掌握了OOA的系统方法,能够从需求出发建立准确的概念模型。
设计技能:学会了OOD的设计原则和模式,能够设计出高质量的软件架构。
建模技术:熟练掌握了UML建模语言,能够用标准化的方式表达设计思想。
实践能力:通过大量练习和案例分析,具备了解决实际问题的设计能力。
面向对象方法不仅是一种技术手段,更是一种思维方式。它帮助我们以更自然、更直观的方式理解和建模复杂系统,是每个软件工程师必须掌握的核心技能。
下一步学习
完成本章学习后,建议继续学习:
- 008-软件测试基础与方法 - 学习软件质量保证技术
- 009-软件质量管理与保证 - 掌握质量管理体系
- 010-软件维护与演化 - 了解软件生命周期管理
实践应用指南
在实际项目中应用面向对象方法的建议:
-
渐进式设计
- 从简单的概念模型开始
- 逐步细化和完善设计
- 保持设计的演化性
-
团队协作
- 建立统一的建模标准
- 定期进行设计评审
- 维护设计文档的一致性
-
工具支持
- 选择合适的建模工具
- 建立设计模板和规范
- 实现设计与代码的同步
更新记录
- 创建时间:2024-01-15
- 更新内容:创建面向对象分析与设计教程,包含完整的OOA/OOD方法论、UML建模技术、设计原则和模式
- 版本:v1.0.0
更多推荐
所有评论(0)