┌─────────────────────────────┐ │ <<interface>> │ │ Transaction │ ← Command ├─────────────────────────────┤ │ + execute(): void │ │ + undo(): void │ └─────────────────────────────┘ △ │ implements │ ┌──────────────────┬───────────────────┐ │ DebitTransaction│ CreditTransaction │ ← Concrete Commands ├──────────────────┼───────────────────┤ │- account: Account│- account: Account │ │- amount: double │- amount: double │ │+ execute() │+ execute() │ │+ undo() │+ undo() │ └──────────────────┴───────────────────┘ ┌─────────────────────────────┐ │ Account │ ← Receiver ├─────────────────────────────┤ │ - balance: double │ │ + debit(double): void │ │ + credit(double): void │ │ + getBalance(): double │ └─────────────────────────────┘ ┌─────────────────────────────────────────┐ │ TransactionProcessor │ ← Invoker ├─────────────────────────────────────────┤ │ + processTransaction(Transaction): void │ └─────────────────────────────────────────┘
Command Interface
:public interface Transaction { void execute(); void undo(); }
Concrete Commands
:public class DebitTransaction implements Transaction { private Account account; private double amount; public DebitTransaction(Account account, double amount) { this.account = account; this.amount = amount; } public void execute() { account.debit(amount); } public void undo() { account.credit(amount); } }Credit Transaction Command:
public class CreditTransaction implements Transaction { private Account account; private double amount; public CreditTransaction(Account account, double amount) { this.account = account; this.amount = amount; } public void execute() { account.credit(amount); } public void undo() { account.debit(amount); } }
Receiver
:public class Account { private double balance; public Account(double initialBalance) { this.balance = initialBalance; } public void debit(double amount) { balance -= amount; System.out.println("Debited: " + amount + ", Balance: " + balance); } public void credit(double amount) { balance += amount; System.out.println("Credited: " + amount + ", Balance: " + balance); } public double getBalance() { return balance; } }
Invoker
:public class TransactionProcessor { public void processTransaction(Transaction transaction) { System.out.println("Processing transaction..."); transaction.execute(); } public void undoTransaction(Transaction transaction) { System.out.println("Undoing transaction..."); transaction.undo(); } }
public class CommandPatternTest { public static void main(String[] args) { // Create the receiver Account account = new Account(1000.0); // Create concrete commands Transaction debitTransaction = new DebitTransaction(account, 200.0); Transaction creditTransaction = new CreditTransaction(account, 150.0); // Create the invoker TransactionProcessor processor = new TransactionProcessor(); System.out.println("Initial Balance: " + account.getBalance()); // Execute transactions processor.processTransaction(debitTransaction); processor.processTransaction(creditTransaction); System.out.println("After Transactions"); // Undo transactions processor.undoTransaction(creditTransaction); processor.undoTransaction(debitTransaction); System.out.println("Final Balance: " + account.getBalance()); } }