面向对象分析与设计的多过程多层级实现
一、面向对象分析阶段:业务级模型
核心目标:理解业务需求,建立领域模型,定义系统边界。
主要模型:
-
业务级用例图
• 作用:捕获用户需求,描述参与者与系统的交互场景,例如“学生选课”用例。
• 抽象层级:宏观业务流程,不涉及技术实现细节。例如,电商系统中“用户下单”用例可能包含“支付”和“库存检查”子流程。 -
业务级类图(领域模型)
• 作用:识别业务实体及其关系,例如“学生”“课程”“选课记录”等类及其关联关系。
• 抽象层级:仅包含业务属性和核心行为(如“学生选课”方法),不涉及技术属性(如数据库字段)。 -
业务级时序图(或活动图)
• 作用:描述端到端的业务流程,例如“用户提交订单→库存校验→支付扣款”的宏观流程。
• 抽象层级:对象为角色(如“用户”“支付系统”),消息为业务动作(如“生成订单”),而非具体接口调用。
关键验证:分析阶段的模型应完全基于业务语言,避免技术术语。
二、面向对象设计阶段:设计级模型
核心目标:将业务需求转化为可落地的技术方案,定义系统架构和模块交互。
主要模型:
-
设计级用例图
• 作用:细化系统功能,例如将“支付”用例拆分为“支付宝支付”和“微信支付”子用例,并定义扩展条件(如支付失败重试)。 -
设计级类图
• 作用:补充技术细节,如类的方法签名(PaymentService.process(amount: Double)
)、接口定义(如PaymentGateway
)和数据库映射关系(如JPA注解)。 -
设计级时序图
• 作用:描述模块或类之间的接口调用流程,例如OrderController
调用InventoryService.checkStock()
。
• 抽象层级:对象为类或组件(如OrderService
),消息为具体方法调用。 -
状态图
• 作用:管理对象生命周期和状态迁移,例如订单状态从“待支付”到“已发货”的转换规则。
• 适用场景:复杂状态逻辑(如支付超时自动取消)。
关键验证:设计模型需明确技术实现,如接口参数、并发控制和事务管理。
三、软件开发阶段:代码级模型
核心目标:根据设计模型生成可执行代码,验证设计与实现一致性。
主要模型:
-
代码级类图
• 作用:直接映射为代码框架,例如通过工具(如MyBatis Generator)将类图转换为实体类(如Student.java
)和DAO接口。 -
代码级时序图
• 作用:调试具体方法调用链,例如验证PaymentServiceImpl
内部调用RiskEvaluator.validate()
的时序。
• 工具支持:通过IDE(如IntelliJ)从代码生成时序图,或通过反向工程生成类图。
关键验证:代码模型需与设计模型保持同步,例如通过UML工具(如PlantUML)实现模型-代码双向工程。
四、模型的分层演进与衔接
- 用例图:
• 业务级→设计级:从“用户支付”到“调用支付宝API”。 - 类图:
• 业务级→设计级→代码级:从“订单类”的领域属性到OrderEntity
的数据库字段。 - 时序图:
• 业务级→设计级→代码级:从“用户提交订单”到OrderController.createOrder()
方法实现。 - 状态图:
• 设计级→代码级:通过Spring StateMachine框架实现状态迁移逻辑。
总结
您的分类基本符合标准流程,但需注意以下细节:
• 状态图通常不划分业务级,因其主要用于设计阶段的状态机实现。
• 代码级模型更关注实现细节(如方法参数、数据库字段),而非独立绘制UML图,通常通过工具自动生成。
• 模型迭代性:分析、设计、开发阶段的模型是逐步细化的,而非完全割裂。例如,类图从业务实体演进到技术实现类。
通过以上分层,可有效降低复杂度,确保从需求到代码的可追溯性
案例:智能烤箱烤面包系统(使用PlantUML分阶段建模)
一、面向对象分析阶段:业务级模型
1. 业务级用例图
目标:描述用户与系统的核心交互流程
PlantUML代码:
@startuml
left to right direction
actor 用户 as User
rectangle 烤箱系统 {
User --> (放入面包) : 触发烤箱工作
User --> (设置温度) : 调节烘焙参数
User --> (查看状态) : 实时监控
(烘焙完成) <.. (烤箱工作) : <<extend>>
}
@enduml
说明:用户核心操作为放入面包、设置温度、查看状态,其中“烘焙完成”是“烤箱工作”的扩展用例。
2. 业务级类图
目标:定义核心业务实体及关系
PlantUML代码:
@startuml
class 面包 {
- 重量: double
- 当前温度: int
+ 被加热()
}
class 烤箱 {
- 目标温度: int
- 计时器: int
+ 启动加热()
+ 停止加热()
}
面包 "1" -- "1" 烤箱 : 烘焙
@enduml
说明:面包与烤箱为1对1关联,反映烘焙关系。
3. 业务级时序图
目标:描述用户操作流程
PlantUML代码:
@startuml
用户 -> 烤箱: 设置温度(180℃)
烤箱 -> 加热模块: 启动加热
加热模块 -> 温度传感器: 实时监测
温度传感器 --> 烤箱: 当前温度=25℃
烤箱 -> 用户: 显示“预热中”
...持续加热直到达标...
烤箱 -> 用户: 显示“烘焙完成”
@enduml
说明:用户设置温度后,烤箱触发加热并反馈状态。
二、面向对象设计阶段:设计级模型
1. 设计级类图
目标:补充技术细节与接口
PlantUML代码:
@startuml
interface 温度控制策略 {
+ 计算加热时间(currentTemp:int): int
}
class 普通加热策略 implements 温度控制策略 {
+ 计算加热时间(currentTemp:int): int
}
class 烤箱控制器 {
- 策略: 温度控制策略
+ 设置策略(strategy: 温度控制策略)
+ 执行烘焙()
}
烤箱控制器 "1" *-- "1" 温度控制策略 : 策略模式
@enduml
说明:引入策略模式实现灵活温控算法。
—
![(https://i-blog.csdnimg.cn/direct/e6e496463c9943d7a997e2f8a44e86f5.png#pic_center)
2. 状态图
目标:管理烤箱生命周期状态
PlantUML代码:
@startuml
[*] --> 待机 : 初始化
待机 --> 预热中 : 用户启动
预热中 --> 烘焙中 : 温度达标
烘焙中 --> 完成 : 计时结束
完成 --> [*] : 用户取出面包
@enduml
说明:状态迁移反映烤箱工作流程。
—
3. 设计级时序图
目标:细化模块间调用逻辑
PlantUML代码:
@startuml
烤箱控制器 -> 温度传感器: 获取当前温度
温度传感器 --> 烤箱控制器: 返回25℃
烤箱控制器 -> 策略: 计算加热时间(25℃)
策略 --> 烤箱控制器: 时间=10分钟
烤箱控制器 -> 加热模块: 持续加热(180℃,10min)
加热模块 -> 面包: 传递热量
@enduml
说明:控制器调用策略算法计算加热时间。
三、软件开发阶段:代码级模型
1. 代码级类图
目标:直接映射实体类与数据库表
PlantUML代码:
@startuml
entity Oven {
+ id: Long
+ targetTemp: Integer
+ timer: Integer
+ status: OvenStatus
}
entity Bread {
+ id: Long
+ weight: Double
+ currentTemp: Integer
}
Oven "1" --o "1" Bread : 包含
@enduml
说明:JPA实体类对应数据库表结构。
2. Spring Boot代码实现
// OvenController.java(API层)
@RestController
@RequestMapping("/api/ovens")
public class OvenController {
@Autowired
private OvenService ovenService;
@PostMapping("/start")
public ResponseEntity<String> startBaking(@RequestBody OvenConfig config) {
ovenService.startBaking(config);
return ResponseEntity.ok("烤箱启动成功");
}
}
// OvenService.java(策略模式实现)
@Service
public class OvenService {
@Autowired
private TemperatureStrategy strategy;
public void startBaking(OvenConfig config) {
int time = strategy.calculateTime(config.getCurrentTemp());
// 调用硬件驱动加热...
}
}
3. 数据库设计
CREATE TABLE oven (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
target_temp INT NOT NULL,
timer INT NOT NULL,
status ENUM('STANDBY', 'PREHEATING', 'BAKING', 'COMPLETED')
);
CREATE TABLE bread (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
weight DOUBLE NOT NULL,
current_temp INT NOT NULL,
oven_id BIGINT REFERENCES oven(id)
);
总结
通过PlantUML分阶段建模,实现从业务需求到代码的完整映射:
- 业务模型:用例图定义用户交互,类图描述核心实体,时序图展示流程。
- 设计模型:类图引入设计模式(策略模式),状态图管理生命周期,时序图细化调用链。
- 代码模型:JPA实体类对应数据库,Spring Boot分层实现业务逻辑。
完整代码示例可参考GitHub模板,结合PlantUML双向工程提升开发效率