如何设计一个ATM | OOD 面向对象高频面试题及解析

问题描述

如何设计一个ATM Machine?

解题思路

这是一道常考的OOD面向对象面试题,属于 Real-life Object Deisgn, 类似面试题型有Vending Machine 等。

更多题型课查看领扣题库官网

1.Clarify

ATM机的Input和Output是什么?
Assumption: Input 是卡, output 是现金

Input 有什么限制吗?
Assumption: 只能是debit card

output 有什么限制吗?
Assumption: 只能是20美元的倍数

AOutput 会不足吗?
Assumption: ATM永远有足够的余额 (Bonus: 这里可以考虑如果不够的话应该怎么处理)

Input 有什么特点?
Assumption: 一张卡可能有多个账户 (Bonus: 这个不太容易想到, 没想到也没关系,我们可以先按照一个account来做)

2.Core objects

Debit Card

ATM Machine

Account

3.Use cases

Take debit card

Authorization / Log in

(Optional - 如果一张卡能有多个account就需要这个) Select account

Check balance

Deposite money

Withdraw money

Log out

4.Classes

ATM Machine
float balance (Optional - 如果ATM机余额有限制就需要这个)

Session currentSession ( Tips : 如果一个主体,它的操作<比如check balance / deposite / withdraw>是针对每一个用户的, 那么经常会考虑到加入Session这个Class。实践中如果碰到需要login/logout的主体,经常会用到Session)

void takeDebitCard (DebitCard card)

List login (String passcode)

void selectAccount (Account account)

float checkBalance ()

void depositeMoney (float amount)

float withDrawMoney (float amount)

void logOut ()

Session
DebitCard currentDebitCard

Account currentAccount

Account
float balance

void depositeMoney (float amount)

withDrawMoney (float amount)

5.Correctness

增加各式的Exceptions

对于ATM机,有许多种Design pattern可以适用,其中比较合适的就有我们《OOD面向对象专题》课上讲过的State Design Pattern, 大家可以自己思考有哪些合适的states。

6.总结

ATM Machine作为一道real life object的题目,做法和我们上课讲过的解法大同小异,其中值得注意的三点分别是对Session的使用;可能出现各式各样的Exception; 以及一张卡对应多个 Account的business logic。

上一篇:Android组成部分


下一篇:Android WifiDisplay分析三:RTSP交互以及数据传输