Design an ATM System

Medium
Financial SystemsStateSingletonChain of Responsibility

Problem Statement

Design an ATM (Automated Teller Machine) system that supports:

  • Card insertion and PIN verification
  • Balance inquiry
  • Cash withdrawal with denomination management
  • Deposit
  • Transaction history

Design Requirements

Key Entities:

  • ATM — Main controller (Singleton)
  • Card — Bank card with card number
  • Account — Bank account with balance
  • CashDispenser — Manages cash denominations (Chain of Responsibility)
  • ATMState — Idle, CardInserted, Authenticated, TransactionInProgress

Key Behaviors:

  • insertCard(card) → validates card
  • enterPin(pin) → authenticates (3 attempts before lockout)
  • withdraw(amount) → dispenses cash if sufficient balance and denominations available
  • deposit(amount) → adds to balance
  • checkBalance() → returns current balance

!Constraints

- PIN has exactly 4 digits; 3 failed attempts locks the card - ATM holds denominations: $100, $50, $20, $10, $5, $1 - Minimum withdrawal: $20, maximum: $1000 per transaction - Must use minimum number of bills - Transaction timeout: 30 seconds of inactivity
Output

Run your code to see output here.