Untuk source code aslinya bisa di lihat pada buku "Java - How to Program, 9th edition by Deitel".
Source code : ATM
- public class ATM
- {
- private boolean userAuthenticated;
- private int currentAccountNumber;
- private Screen screen;
- private Keypad keypad;
- private CashDispenser cashDispenser;
- private DepositSlot depositSlot;
- private BankDatabase bankDatabase;
- private static final int BALANCE_INQUIRY = 1;
- private static final int WITHDRAWAL = 2;
- private static final int DEPOSIT = 3;
- private static final int EXIT = 4;
- public ATM()
- {
- userAuthenticated = false;
- currentAccountNumber = 0;
- screen = new Screen();
- keypad = new Keypad();
- cashDispenser = new CashDispenser();
- depositSlot = new DepositSlot();
- bankDatabase = new BankDatabase();
- }
- public void run()
- {
- while(true)
- {
- while(!userAuthenticated)
- {
- screen.displayMessageLine("\nSelamat Datang!");
- authenticateUser();
- }
- performTransactions();
- userAuthenticated = false;
- currentAccountNumber = 0;
- screen.displayMessageLine("\nTerima Kasih! Jaga kerahasiaan password anda!");
- }
- }
- private void authenticateUser()
- {
- screen.displayMessage("\nSilahkan masukkan ID AKUN anda: ");
- int accountNumber = keypad.getInput();
- screen.displayMessage("\nSilahkan masukkan PIN anda: ");
- int pin = keypad.getInput();
- userAuthenticated = bankDatabase.authenticateUser(accountNumber, pin);
- if(userAuthenticated)
- {
- currentAccountNumber = accountNumber;
- }
- else
- screen.displayMessageLine("PIN atau ID AKUN salah. Silahkan masukkan kembali.");
- }
- private void performTransactions()
- {
- Transaction currentTransaction = null;
- boolean userExited = false;
- while(!userExited)
- {
- int mainMenuSelection = displayMainMenu();
- switch(mainMenuSelection)
- {
- case BALANCE_INQUIRY:
- case WITHDRAWAL:
- case DEPOSIT:
- currentTransaction = createTransaction(mainMenuSelection);
- currentTransaction.execute();
- break;
- case EXIT:
- screen.displayMessageLine("\nSilahkan ambil kartu atm anda.");
- userExited = true;
- break;
- default:
- screen.displayMessageLine("\nPilihan tidak tersedia. Silahkan masukkan pilihan anda.");
- break;
- }
- }
- }
- private int displayMainMenu()
- {
- screen.displayMessageLine("\nMain menu:");
- screen.displayMessageLine("1. Cek Saldo");
- screen.displayMessageLine("2. Tarik Tunai");
- screen.displayMessageLine("3. Setor Tunai");
- screen.displayMessageLine("4. Keluar\n");
- screen.displayMessage("Masukkan Pilihan anda:");
- return keypad.getInput();
- }
- private Transaction createTransaction(int type)
- {
- Transaction temp = null;
- switch(type)
- {
- case BALANCE_INQUIRY:
- temp = new BalanceInquiry(currentAccountNumber, screen, bankDatabase);
- break;
- case WITHDRAWAL:
- temp = new Withdrawal(currentAccountNumber, screen, bankDatabase, keypad, cashDispenser);
- break;
- case DEPOSIT:
- temp = new Deposit(currentAccountNumber, screen, bankDatabase, keypad, depositSlot);
- break;
- }
- return temp;
- }
- }
- public class DepositSlot
- {
- public boolean isEnvelopeReceived()
- {
- return true;
- }
- }
- public class Screen
- {
- public void displayMessage(String message)
- {
- System.out.print(message);
- }
- public void displayMessageLine(String message)
- {
- System.out.println(message);
- }
- public void displayDollarAmount(double amount)
- {
- System.out.printf("Rp.%,.2f", amount);
- }
- }
- import java.util.Scanner;
- public class Keypad
- {
- private Scanner input;
- public Keypad()
- {
- input = new Scanner(System.in);
- }
- public int getInput()
- {
- return input.nextInt();
- }
- }
- public class CashDispenser
- {
- private final static int INITIAL_COUNT = 50000;
- private int count;
- public CashDispenser()
- {
- count = INITIAL_COUNT;
- }
- public void dispenseCash(int amount)
- {
- int billsRequired = amount / 20;
- count -= billsRequired;
- }
- public boolean isSufficientCashAvailable(int amount)
- {
- int billsRequired = amount / 20;
- if(count >= billsRequired)
- return true;
- else
- return false;
- }
- }
- public abstract class Transaction
- {
- private int accountNumber;
- private Screen screen;
- private BankDatabase bankDatabase;
- public Transaction(int userAccountNumber, Screen atmScreen, BankDatabase atmBankDatabase)
- {
- accountNumber = userAccountNumber;
- screen = atmScreen;
- bankDatabase = atmBankDatabase;
- }
- public int getAccountNumber()
- {
- return accountNumber;
- }
- public Screen getScreen()
- {
- return screen;
- }
- public BankDatabase getBankDatabase()
- {
- return bankDatabase;
- }
- abstract public void execute();
- }
- public class Withdrawal extends Transaction
- {
- private int amount;
- private Keypad keypad;
- private CashDispenser cashDispenser;
- private final static int CANCELED = 6;
- public Withdrawal(int userAccountNumber, Screen atmScreen, BankDatabase atmBankDatabase,
- Keypad atmKeypad, CashDispenser atmCashDispenser)
- {
- super(userAccountNumber, atmScreen, atmBankDatabase);
- keypad = atmKeypad;
- cashDispenser = atmCashDispenser;
- }
- @Override
- public void execute()
- {
- boolean cashDispensed = false;
- double availableBalance;
- BankDatabase bankDatabase = getBankDatabase();
- Screen screen = getScreen();
- do
- {
- amount = displayMenuOfAmounts();
- if(amount != CANCELED)
- {
- availableBalance = bankDatabase.getAvailableBalance(getAccountNumber());
- if(amount <= availableBalance)
- {
- if(cashDispenser.isSufficientCashAvailable(amount))
- {
- bankDatabase.debit(getAccountNumber(), amount);
- cashDispenser.dispenseCash(amount);
- cashDispensed = true;
- screen.displayMessageLine("\nSaldo anda telah " + " dipotong. Silahkan ambil uang anda sekarang.");
- }
- else
- screen.displayMessageLine("\nSaldo tidak cukup." +
- "\n\nSilahkan pilih jumlah yang lebih kecil.");
- }
- else
- {
- screen.displayMessageLine("\nSaldo tidak cukup." +
- "\n\nSilahkan pilih jumlah yang lebih kecil.");
- }
- }
- else
- {
- screen.displayMessageLine("\nMembatalkan transaksi...");
- return;
- }
- } while(!cashDispensed);
- }
- private int displayMenuOfAmounts()
- {
- int userChoice = 0;
- Screen screen = getScreen();
- int[] amounts = {0, 50000, 100000, 200000, 300000, 500000};
- while(userChoice == 0)
- {
- screen.displayMessageLine("\nPilihan tarik tunai:");
- screen.displayMessageLine("1. Rp. 50.000");
- screen.displayMessageLine("2. Rp. 100.000");
- screen.displayMessageLine("3. Rp. 200.000");
- screen.displayMessageLine("4. Rp. 300.000");
- screen.displayMessageLine("5. Rp. 500.000");
- screen.displayMessageLine("0. Batalkan");
- screen.displayMessageLine("\nSilahkan masukkan pilihan anda:");
- int input = keypad.getInput();
- switch(input)
- {
- case 1:
- case 2:
- case 3:
- case 4:
- case 5:
- userChoice = amounts[input];
- break;
- case 0:
- userChoice = CANCELED;
- break;
- default:
- screen.displayMessageLine("\nPilihan tidak tersedia. Silahkan masukkan pilihan anda.");
- }
- }
- return userChoice;
- }
- }
- public class Deposit extends Transaction
- {
- private double amount;
- private Keypad keypad;
- private DepositSlot depositSlot;
- private final static int CANCELED = 0;
- public Deposit(int userAccountNumber, Screen atmScreen,
- BankDatabase atmBankDatabase, Keypad atmKeypad,
- DepositSlot atmDepositSlot)
- {
- super(userAccountNumber, atmScreen, atmBankDatabase);
- keypad = atmKeypad;
- depositSlot = atmDepositSlot;
- }
- @Override
- public void execute()
- {
- BankDatabase bankDatabase = getBankDatabase();
- Screen screen = getScreen();
- amount = promptForDepositAmount();
- if(amount != CANCELED)
- {
- screen.displayMessage("\nSilahkan masukkan uang anda");
- screen.displayDollarAmount(amount);
- screen.displayMessageLine(".");
- boolean envelopeReceived = depositSlot.isEnvelopeReceived();
- if(envelopeReceived)
- {
- screen.displayMessageLine("\nUang anda telah" +
- "diterima.\nKETERANGAN : Uang belum dapat diambil " +
- "sampai setelah kita melakukan verifikasi.");
- bankDatabase.credit(getAccountNumber(), amount);
- }
- else
- {
- screen.displayMessageLine("\nAnda belum memasukkan " +
- "uang anda, ATM sedang membatalkan transaksi anda.");
- }
- }
- else
- {
- screen.displayMessageLine("\nMembatalkan transaksi...");
- }
- }
- private double promptForDepositAmount()
- {
- Screen screen = getScreen();
- screen.displayMessage("\nSilahkan masukkan jumlah uang dalam " + "RUPIAH (Tekan 0 untuk membatalkan): ");
- int input = keypad.getInput();
- if(input == CANCELED)
- return CANCELED;
- else
- {
- return(double) input / 1;
- }
- }
- }
- public class BalanceInquiry extends Transaction
- {
- public BalanceInquiry(int userAccountNumber, Screen atmScreen, BankDatabase atmBankDatabase)
- {
- super(userAccountNumber, atmScreen, atmBankDatabase);
- }
- @Override
- public void execute()
- {
- BankDatabase bankDatabase = getBankDatabase();
- Screen screen = getScreen();
- double availableBalance = bankDatabase.getAvailableBalance(getAccountNumber());
- double totalBalance = bankDatabase.getTotalBalance(getAccountNumber());
- screen.displayMessageLine("\nSaldo anda:");
- screen.displayMessage(" - Saldo tersedia:");
- screen.displayDollarAmount(availableBalance);
- screen.displayMessage("\n - Saldo total: ");
- screen.displayDollarAmount(totalBalance);
- screen.displayMessageLine("");
- }
- }
- public class BankDatabase
- {
- private Account[] accounts;
- public BankDatabase()
- {
- accounts = new Account[2];
- accounts[0] = new Account(12345, 54321, 1000000, 1200000);
- accounts[1] = new Account(98765, 56789, 2000000, 2000000);
- }
- private Account getAccount(int accountNumber)
- {
- for(Account currentAccount : accounts)
- {
- if(currentAccount.getAccountNumber() == accountNumber)
- return currentAccount;
- }
- return null;
- }
- public boolean authenticateUser(int userAccountNumber, int userPIN)
- {
- Account userAccount = getAccount(userAccountNumber);
- if(userAccount != null)
- return userAccount.validatePIN(userPIN);
- else
- return false;
- }
- public double getAvailableBalance(int userAccountNumber)
- {
- return getAccount(userAccountNumber).getAvailableBalance();
- }
- public double getTotalBalance(int userAccountNumber)
- {
- return getAccount(userAccountNumber).getTotalBalance();
- }
- public void credit( int userAccountNumber, double amount)
- {
- getAccount(userAccountNumber).credit(amount);
- }
- public void debit(int userAccountNumber, double amount)
- {
- getAccount(userAccountNumber).debit(amount);
- }
- }
- public class Account
- {
- private int accountNumber;
- private int pin;
- private double availableBalance;
- private double totalBalance;
- public Account(int theAccountNumber, int thePIN, double theAvailableBalance, double theTotalBalance)
- {
- accountNumber = theAccountNumber;
- pin = thePIN;
- availableBalance = theAvailableBalance;
- totalBalance = theTotalBalance;
- }
- public boolean validatePIN(int userPIN)
- {
- if(userPIN == pin)
- return true;
- else
- return false;
- }
- public double getAvailableBalance()
- {
- return availableBalance;
- }
- public double getTotalBalance()
- {
- return totalBalance;
- }
- public void credit(double amount)
- {
- totalBalance += amount;
- }
- public void debit(double amount)
- {
- availableBalance -= amount;
- totalBalance -= amount;
- }
- public int getAccountNumber()
- {
- return accountNumber;
- }
- }
- public class ATMCaseStudy
- {
- //main method creates and runs the ATM
- public static void main(String[] args)
- {
- ATM theATM = new ATM();
- theATM.run();
- }
- }
Hasilnya:
1. Cek saldo
2. Tarik tunai
3. Setor tunai
4. Keluar
Tidak ada komentar:
Posting Komentar