Skip to main content

面向对象设计 - 管理类

info

设计 模拟/替代管理员日常工作的系统

  • Gym
  • Parking lot
  • Restaurant
  • Library
  • Super market
  • Hotel

管理类解题思路

  1. Clarify - What

    从管理的名词来考虑 e.g. Design parking lot

  • keyword1: Parking lot
  • keyword2: Vehicle
  1. Core object - 有进有出

    考虑这个管理系统里,Input 和 Output 是什么 e.g. Elevator System

  • Input: Request
  • Output: Elevator
  1. Use case - 从管理员角度考虑
  • Reserve 预定。单独的部分,不是所有管理类系统都需要预定
  • Serve 服务
  • Checkout 结账
  1. 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