面向对象设计 - 管理类
info
设计 模拟/替代管理员日常工作的系统
- Gym
- Parking lot
- Restaurant
- Library
- Super market
- Hotel
管理类解题思路
-
Clarify - What
从管理的名词来考虑 e.g. Design parking lot
- keyword1: Parking lot
- keyword2: Vehicle
-
Core object - 有进有出
考虑这个管理系统里,Input 和 Output 是什么 e.g. Elevator System
- Input: Request
- Output: Elevator
- Use case - 从管理员角度考虑
- Reserve 预定。单独的部分,不是所有管理类系统都需要预定
- Serve 服务
- Checkout 结账
-
Class
设计类图的时候,经常可以使用收据的形式,来保管信息 e.g. 图书馆
- User
- Receipt: 记录哪一个 user 借了哪些 books,当还书时销毁掉 receipt
- Book
实战 - Design Parking Lot
Clarify
Step1. What
keywords: Parking lot, Vehicle, Parking Spot ...
- Parking Spot 是否考虑残疾人车位
- Parking Spot 是否考虑充电车位
- 如何设计停车场来支持不同大小的车
对于本题
- Parking lot: 考虑多层的 Parking lot,无错层
- Vehicle: 考虑三种大小的车
- 不考虑残疾人停车位/充电车位
Step2. How
已知信息: 所有车位都是相同规格的 要站在 题目的主体 即 Parking lot 去考虑,而不是站在停车客户的视角去考虑
规则 1: 如何停车
- 从车的角度: 开车进停车场 -> 经过每一个位置看看能不能停 -> 停进车位
- 从停车场的角度: 开车进停车场 -> 返回一个能停的位置 -> 停进车位
针对本题
- 如果有大车,可以横向停车,即占多个车位
- 停车场能够显示空闲位置的个数
规则 2: 收费
一般只需要简单的思考是否需要收费
针对本题
- 根据时间收费
Step3. Who
N/A
Core Object
- 什么是 Core object
- 为什么要定义 Core object
- 如何定义 Core object
Cases
- 什么是 Use case
- 为什么要写 Use case
- 如何写 Use case
Vehicle
N/A
Parking Lot
- Get available count
- Park vehicle
- Clear spot
- Calculate price
对应上文所提到的管理类场景 Use case:
- Reservation: [X]
- Serve: Parking vehicle
- Check out: Clear spot + Calculate price
Spot
N/A
Class
- 什么是类图
- 为什么要画类图
- 怎么画类图
Use case: Get available counts
Parking lot shows how many available spots in total
- 变量
int availableCount
记录可用停车位数量, 函数public int getAvailableCount()
来返回当前可用的停车位数量.
如何分别显示出每一层的空位个数
- 新增
Level
类,ParkingLot
类中保存List<Level> levels
Use case: Park vehicle
- Parking lot checks the size of vehicle: 对每个汽车类增加 变量
int Size
和 方法public int getSize()
- Parking lot find an available spot for this vehicle: 对
Spot
类增加boolean available
和 方法public boolean isAvailable()
- Vehicle takes the spot:
Spot
类中新增 函数void takeSpot()
和void leaveSpot()
Use case: Clear spot
- Parking lot find the spot to clear
- Update spot to be available
- Update available count for each levle 当车离开的时候更新 available count