Senin, 15 Mei 2017

OOP pada Mesin ATM

Kali ini saya akan membagikan Source Code dari buku "Java - How To Program -  Ninth Edition (2012)" Bab 13 yaitu OOP pada Mesin ATM





  • untuk class study_case atau Main
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
/** Study_case Class @author (Tegar Satrio Utomo 5115100178) @version (16/5/17) */

public class Study_Case
{
    public static void main( String[] args )
    {
        ATM theATM = new ATM();
        theATM.run();
    }
}
  • untuk class ATM
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
/** ATM Class @author (Tegar Satrio Utomo 5115100178) @version (16/5/17) */

public class ATM
{
    private boolean userAuthenticated; // untuk cek ke otekntikan User
    private int currentAccountNumber; //cek user sekarang
    private Screen screen;
    private Keypad keypad;
    private CashDispenser cashDispenser;
    private DepositSlot depositSlot;
    private BankDatabase bankDatabase; // untuk informasi database akun
    
    // menu
    private static final int saldo = 1;
    private static final int tarik_tunai = 2;
    private static final int setoran = 3;
    private static final int exit = 4;
    
    public ATM()
    {
        userAuthenticated = false; // inisiasi
        currentAccountNumber = 0; //inisiasi
        screen = new Screen(); 
        keypad = new Keypad();
        cashDispenser = new CashDispenser();
        depositSlot = new DepositSlot();
        bankDatabase = new BankDatabase();
    }

    
    public void run()
    {
        while(true)
        {
            while(!userAuthenticated)
            {
                screen.displayMessageLine("WELCOME");
                authenticateUser(); // mengotentikasi user
            }
            
            performTransactions(); 
            userAuthenticated = false; // reset 
            currentAccountNumber = 0; // reset
            screen.displayMessageLine("\nTHANK YOU");
        }
    }
    
    private void authenticateUser()
    {
        screen.displayMessageLine("\nMASUKKAN ACCOUNT NUMBER: ");
        int accountNumber = keypad.getInput(); // account
        screen.displayMessageLine("MASUKKAN PIN: ");
        int pin = keypad.getInput(); // pin
        
        userAuthenticated = bankDatabase.authenticateUser (accountNumber, pin);
        if(userAuthenticated)
        {
            currentAccountNumber = accountNumber; //save
        }
        else
        screen.displayMessageLine("\nAKUN ATAU PIN SALAH, COBA LAGI");
    }
    
    private void performTransactions()
    {
        //untuk menyimpan transaksi sekarang
        Transaction currentTransaction = null;
        boolean userExited = false; // inisiasi
        while(!userExited)
        {
            int mainMenuSelection = displayMainMenu();
            switch(mainMenuSelection)
            {
                case saldo:
                case tarik_tunai:
                case setoran:
                
                currentTransaction = createTransaction(mainMenuSelection);
                currentTransaction.execute();
                break;
                case exit:
                screen.displayMessageLine("\nKeluar");
                userExited = true; // user keluar
                break;
                default: screen.displayMessageLine("INPUT SALAH, COBA LAGI");
                break;
            }
        }
    }
    
    private int displayMainMenu()
    {
        screen.displayMessageLine("MENU : \n");
        screen.displayMessageLine("1 - CEK SALDO\n");
        screen.displayMessageLine("2 - TARIK TUNAI\n");
        screen.displayMessageLine("3 - SETORAN TUNAI\n");
        screen.displayMessageLine("4 - EXIT\n");
        screen.displayMessageLine("MASUKKAN INPUT: ");
        return keypad.getInput();// intup dari user
    }
    
    private Transaction createTransaction (int type)
    {
        Transaction temp = null; // inisiasi
        switch(type)
        {
            case saldo:
            temp = new Saldo(currentAccountNumber, screen, bankDatabase);
            break;
            case tarik_tunai:
            temp = new Tarik_Tunai(currentAccountNumber, screen,bankDatabase, keypad, cashDispenser);
            break;
            case setoran:
            temp = new Setoran(currentAccountNumber, screen, bankDatabase,keypad,depositSlot);
            break;
        }
        return temp;
    }
}
  • untuk class Screen
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
/** Screen Class @author (Tegar Satrio Utomo 5115100178) @version (16/5/17) */

public class Screen
{
    public void displayMessage(String message)
    {
        System.out.print(message);
    }
    
    public void displayMessageLine(String message)
    {
        System.out.print(message);
    }
    
    public void displayAmount(double amount)
    {
        System.out.printf("$%,.2f",amount);
    }
    
}
  • untuk class Keypad
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
/** Keypad Class @author (Tegar Satrio Utomo 5115100178) @version (16/5/17) */

import java.util.Scanner;
public class Keypad
{
    private Scanner input;

    public Keypad()
    {
       input = new Scanner(System.in);
    }

    public int getInput()
    {
        return input.nextInt();
    }
}
  • untuk class  Cash Dispenser
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/** Cash Dispenser Class @author (Tegar Satrio Utomo 5115100178) @version (16/5/17) */

public class CashDispenser
{
    private final static int INITIAL_COUNT = 500;
    private int count;

     public CashDispenser()
    {
        count = INITIAL_COUNT;
    }

     public void dispenseCash(int amount)
    {
        int billsRequired = amount/20;
        count -=billsRequired; //update
    }
    
    public boolean isSufficientCashAvailable(int amount)
    {
        int billsRequired = amount/20;
        if (count>=billsRequired)//uang tersedia
        return true;
        else
        return false; //uang tidak tersedia
    }
}
  • untuk class  Deposit Slot
1
2
3
4
5
6
7
8
9
/** Deposit Slot Class @author (Tegar Satrio Utomo 5115100178) @version (16/5/17) */

public class DepositSlot
{
     public boolean isEnvelopeReceived()
    {
        return true; //asumsi bahwa uang talah di masukkan
    }
}
  • untuk class  Account
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
/** Account Class @author (Tegar Satrio Utomo 5115100178) @version (16/5/17) */

public class Account
{
    private int accountNumber;
    private int pin;
    private double availableBalance; // saldo yang dapat ditarik
    private double totalBalance;

     public Account(int theAccountNumber, int thePIN, double theAvailableBalance, double theTotalBalance)
    {
        accountNumber = theAccountNumber;
        pin = thePIN;
        availableBalance = theTotalBalance;
        totalBalance = theTotalBalance;
    }

    // cek pin
     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;
    }
}
  • untuk class Bank Database
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
/** Bank Database Class @author (Tegar Satrio Utomo 5115100178) @version (16/5/17) */

public class BankDatabase
{
    private Account[] accounts;
    
    public BankDatabase()
    {
        accounts = new Account[2];
        accounts[0]= new Account(12345,54321,1000.0,1200.0);
        accounts[1]= new Account(98765,56789,200.0,200.0);
    }

    public Account getAccount(int accountNumber)
    {
        for(Account currentAccount : accounts)
        {
            if(currentAccount.getAccountNumber()==accountNumber)
            return currentAccount;
        }
        
        return null;//jika tidak ada akun yang cocok
    }
    
    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);
    }
}
  • untuk  class Transaction
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/** Transaction Class @author (Tegar Satrio Utomo 5115100178) @version (16/5/17) */

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();
}
  • untuk class  Saldo
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/** Saldo Class @author (Tegar Satrio Utomo 5115100178) @version (16/5/17) */

public class Saldo extends Transaction
{
     public Saldo(int userAccountNumber, Screen atmScreen, BankDatabase atmBankDatabase)
    {
        super(userAccountNumber, atmScreen, atmBankDatabase);
    }

    @Override
     public void execute()
    {
        // mengambil referensi dairi database dan screen
        BankDatabase bankDatabase = getBankDatabase();
        Screen screen = getScreen();
        // mengambil saldo tersedia
        double availableBalance = bankDatabase.getAvailableBalance( getAccountNumber() );
        // mengambil total saldo
        double totalBalance = bankDatabase.getTotalBalance(getAccountNumber());
        //menampilkan informasi
        screen.displayMessageLine("\nInfo Saldo:");
        screen.displayMessage(" - Saldo Tersedia: ");
        screen.displayAmount(availableBalance);
        screen.displayMessage("\n - Total balance:  ");
        screen.displayAmount(totalBalance);
        screen.displayMessageLine("");
    }
}
  • untuk class  Tarik Tunai
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/** Tarik_Tunai Class @author (Tegar Satrio Utomo 5115100178) @version (16/5/17) */

public class Tarik_Tunai extends Transaction
{
    private int amount;
    private Keypad keypad;
    private CashDispenser cashDispenser;
    
    private final static int batal = 6;

     public Tarik_Tunai(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; // uang belum keluar
        double availableBalance;
        BankDatabase bankDatabase = getBankDatabase();
        Screen screen = getScreen();
        do
        {
            amount = displayMenuOfAmounts();
            if(amount!=batal)
            {
                availableBalance = bankDatabase.getAvailableBalance(getAccountNumber());
            
                if(amount <= availableBalance)//cek apakah saldo di akun mencukupi
                {
                    if(cashDispenser.isSufficientCashAvailable(amount))
                    {
                        bankDatabase.debit(getAccountNumber(),amount);
                        cashDispenser.dispenseCash(amount);// mengeluarkan uang
                        cashDispensed = true;
                        screen.displayMessageLine("\nSilahkan Ambil Uang Anda");
                    }    
                    else
                        screen.displayMessageLine("\nUang di mesin ATM tidak mencukupi\nsilahkan pilih nominal yang lebih kecil");
                    }
                    else
            
                    screen.displayMessageLine("\nSaldo tidak mencukupi\nsilahkan pilih nominal yang lebih kecil");
            }
            else
            {
                screen.displayMessageLine("\nTransaksi Batal");
                return;
            }
        }while(!cashDispensed);
    }
    
    private int displayMenuOfAmounts()
    {
        int userChoice =0;
        Screen screen = getScreen();
        int[] amounts={0,20,40,60,100,200};
        while(userChoice==0)
        {
            screen.displayMessageLine( "\nTarikan Tunai:" );
            screen.displayMessageLine( "\n1 - $20" );
            screen.displayMessageLine( "\n2 - $40" );
            screen.displayMessageLine( "\n3 - $60" );
            screen.displayMessageLine( "\n4 - $100" );
            screen.displayMessageLine( "\n5 - $200" );
            screen.displayMessageLine( "\n6 - Cancel transaction" );
            screen.displayMessage( "\nPilih Nominal: " );
            int input = keypad.getInput(); // mengambil input user
            
            switch ( input )
            {
                case 1: // pilihan untuk nominal tarik tunai
                case 2:  
                case 3:  
                case 4:
                case 5:
                userChoice = amounts[input]; // pilihan user
                break;
                case batal: // jika batal
                userChoice = batal;
                break;
                default: 
                screen.displayMessageLine(
                "\nINPUT SALAH" );
            }
        }
        
        return userChoice;
    }
}
  • untuk class  Setoran

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
/** Setoran Class @author (Tegar Satrio Utomo 5115100178) @version (16/5/17) */

public class Setoran extends Transaction
{
    private double amount;
    private Keypad keypad;
    private DepositSlot depositSlot;
    private final static int batal = 0;

    public Setoran(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 != batal )
        {
            screen.displayMessage("\nSilahkan masukkan uang " );
            screen.displayAmount( amount );
            screen.displayMessageLine( "." );
            boolean envelopeReceived = depositSlot.isEnvelopeReceived();
            
            if(envelopeReceived)
            {
                screen.displayMessageLine("\nUang telah di setorkan");
                bankDatabase.credit(getAccountNumber(),amount);
            }
            else
            screen.displayMessageLine("\nUang Belum Masuk, Transaksi Dibatalkan");
        }
        else
        screen.displayMessageLine("\nTransaksi Batal");
    }
    
    private double promptForDepositAmount()
    {
        Screen screen = getScreen();
        screen.displayMessage("\nMasukkan nilai Setoran, atau 0 untuk Batal");
        int input = keypad.getInput();
        if ( input == batal )
        return batal;
        else
        {
            return ( double ) input;
        }
    }
}

  • untuk Outputnya















Tidak ada komentar:

Posting Komentar