Back to LLD explorer
State / Concurrency Patterns: State, Chain of Responsibility

ATM Machine

Hard

Problem Summary

Design an ATM controller that processes cards, verifies security PINs, updates accounts, and dispenses cash.

Functional Scope

  • ATM transitions: Idle -> HasCard -> PinEntered -> Dispensing -> TransactionComplete.
  • Support multiple currency denominations ($10, $20, $50, $100).
  • Implement ATM cash limits and roll back transactions if dispenser fails.

Entity-Relationship (ER) Schema

ATM [1] <---> [1] ATMState
ATM [1] <---> [1] CashDispenser
CashDispenser [1] <---> [0..1] CashDispenser (Next Chain)

Design Approach

Combine the State pattern (for card handling steps) with Chain of Responsibility (for resolving cash dispensing counts of bills).

Core Classes & Models

ATM (Main context class)ATMState (State interfaces)CashDispenser (Base link handler in Chain of Responsibility)
Code Blueprint
public abstract class CashDispenser {
    protected CashDispenser nextDispenser;
    public abstract void dispense(double amount);
}