ATM系统采用面向对象设计,包含Account、Card、ATM、BankSystem四类:Account管理余额与资金操作;Card关联账户并验证密码;ATM负责状态驱动交互;BankSystem维护卡号到Card的映射;各司其职,组合协作,职责清晰,易于扩展。

用面向对象逻辑写一个控制台ATM菜单,核心是把“人”“卡”“账户”“机器”这些现实角色,变成清晰的类,各自管好自己的数据和行为,再通过协作完成取款、查询等操作。
设计关键类:职责分明,各司其职
不堆砌功能,先搭四个基础类:
-
Account(账户类):存余额、账号、密码(简单校验用),提供
deposit()、withdraw()、getBalance()方法。所有资金变动只通过它发生,不裸露余额字段。 -
Card(银行卡类):含卡号、关联的
Account引用、是否锁定状态。验证密码时调用Account.checkPassword(),不自己存密码。 -
ATM(ATM机类):持有一个
Card(当前插卡状态)、一个Account(当前登录账户)。负责显示菜单、读取用户输入、调用对应业务方法,不处理具体金额逻辑。 -
BankSystem(银行系统类):模拟后台,用字典存
Card对象(卡号→Card),提供insertCard(cardNumber)方法供ATM调用——这是“插卡”动作的实质。
用组合代替继承,让关系更自然
ATM里不写“我是一台机器”,而是声明private Card currentCard;;Card里不写“我是张卡”,而是声明private Account linkedAccount;。这样,插卡 → ATM拿到Card → Card找到Account → 调用withdraw(),链条清晰,修改某部分不影响其他。比如换掉账户实现(加利息计算),只要Account接口不变,ATM和Card完全不用动。
菜单交互:用状态驱动流程,避免大段if-else
在ATM类中定义一个currentStatus枚举(如WAITING_FOR_CARD、WAITING_FOR_PIN、IN_SESSION),每次用户输入后,根据当前状态决定下一步:
– 插卡后进入WAITING_FOR_PIN,提示输密码;
– 密码正确则切到IN_SESSION,显示主菜单;
– 选“取款”就调currentCard.getLinkedAccount().withdraw(amount),失败则提示余额不足;
– 选“退卡”就清空currentCard,回到WAITING_FOR_CARD。
这样逻辑分散在状态切换和方法调用里,主循环干净,易读易调。
控制台细节:小技巧提升真实感
不用花哨UI,但加点细节让操作更顺:
– 输入密码时用Console.ReadKey(true)(C#)或getpass()(Python)隐藏字符;
– 每次操作后显示简短反馈,如“取款成功,余额:¥1250.00”;
– 错误时不崩,提示“密码错误,请重试”并保持当前状态;
– 退出选项写成“0. 退出系统”,和其他选项对齐,用户扫一眼就知道怎么退出。


















