1. Main Class (GTO)
public class GTO{
private boolean userAuthenticated;
private int currentAccountNumber;
private Screen screen;
private Keypad keypad;
private CashDispenser cashDispenser;
private BankDatabase bankDatabase;
private static final int BALANCE_INQUIRY = 1;
private static final int WITHDRAWAL = 2;
private static final int EXIT = 3;
public GTO(){
userAuthenticated = false;
currentAccountNumber = 0;
screen = new Screen();
keypad = new Keypad();
cashDispenser = new CashDispenser();
bankDatabase = new BankDatabase();
}
public void run(){
while(true){
while(!userAuthenticated){
screen.displayMessageLine("\nWelcome!");
authenticateUser();
}
performTransactions();
userAuthenticated = false;
currentAccountNumber = 0;
screen.displayMessageLine("\nThank You!\nGoodbye!");
}
}
private void authenticateUser(){
screen.displayMessage("\nPlease enter your account number : ");
int accountNumber = keypad.getInput();
userAuthenticated = bankDatabase.authenticateUser(accountNumber);
if(userAuthenticated){
currentAccountNumber = accountNumber;
}
else{
screen.displayMessageLine("Invalid ID.");
screen.displayMessageLine("Please Try Again.");
}
}
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("\nExiting the system...");
userExited = true;
break;
default :
screen.displayMessageLine("\nYou did not enter a valid selection.");
screen.displayMessageLine("Please try again.");
break;
}
}
}
private int displayMainMenu(){
screen.displayMessageLine("\nChoose to continue :");
screen.displayMessageLine("1 - Saldo Kartu");
screen.displayMessageLine("2 - Durasi Parkir");
screen.displayMessageLine("3 - Exit\n");
screen.displayMessage("Enter a choice : ");
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;
}
return temp;
}
}
2. Screen
= menjalankan semua proses yang menampilkan output
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("$%,.2f", amount);
}
}
3. Keypad
= menerima inputan pengunjung
import java.util.Scanner;
public class Keypad{
private Scanner input;
public Keypad(){
input = new Scanner(System.in);
}
public int getInput(){
return input.nextInt();
}
}
4. CashDispenser
= mengecek saldo mencukupi atau tidak untuk membeli tiket
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;
}
public boolean isSufficientCashAvailable(int amount){
int billsRequired = amount / 20;
if(count >= billsRequired){
return true;
}
else{
return false;
}
}
}
5. Transaction
= mengatur pembayaran dan sisa saldo
public abstract class Transaction{
private int accountNumber;
private Screen screen;
private BankDatabase bankDatabase;
public Transaction(int userAccountNumber, Screen gtoScreen, BankDatabase gtoBankDatabase){
accountNumber = userAccountNumber;
screen = gtoScreen;
bankDatabase = gtoBankDatabase;
}
public int getAccountNumber(){
return accountNumber;
}
public Screen getScreen(){
return screen;
}
public BankDatabase getBankDatabase(){
return bankDatabase;
}
abstract public void execute();
}
6. Withdrawal
= mengetur proses pembayaran dengan mengecek variabel
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;
public class Withdrawal extends Transaction{
private int amount;
private Keypad keypad;
int price;
int[] amounts = {0, 20, 40, 60, 100, 200};
private CashDispenser cashDispenser;
private final static int CANCELED = 6;
public Withdrawal(int userAccountNumber, Screen gtoScreen, BankDatabase gtoBankDatabase, Keypad gtoKeypad, CashDispenser gtoCashDispenser){
super(userAccountNumber, gtoScreen, gtoBankDatabase);
keypad = gtoKeypad;
cashDispenser = gtoCashDispenser;
}
@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("\nYour cash has been dispensed. Please take your struct now.");
//BankDatabase bankDatabase = getBankDatabase();
availableBalance = bankDatabase.getAvailableBalance(getAccountNumber());
screen.displayMessageLine("\nParkir Information : ");
screen.displayMessage(" - TAMAN BUNGKUL -\n");
screen.displayMessage(" - Tanggal Transaksi : " + dateFormat.format(date) + " \n");
screen.displayMessage(" - Harga Tiket : ");
screen.displayDollarAmount(amounts[price]);
screen.displayMessage("\n");
screen.displayMessage(" - Sisa Saldo Anda : ");
screen.displayDollarAmount(availableBalance);
screen.displayMessageLine("");
}
}
else{
screen.displayMessageLine("\nInsufficient funds in your account.");
}
}
else{
screen.displayMessageLine("\nCancelling transactions...");
return;
}
} while(!cashDispensed);
}
private Date date;
private DateFormat dateFormat;
private int displayMenuOfAmounts(){
int userChoice = 0;
dateFormat = new SimpleDateFormat("dd/MM/yyyy");
date = new Date();
Screen screen = getScreen();
while(userChoice == 0){
screen.displayMessageLine("\nDurasi Parkir : ");
screen.displayMessageLine("1 - motor 1 jam $20");
screen.displayMessageLine("2 - motor 3 jam $40");
screen.displayMessageLine("3 - motor >3 jam $60");
screen.displayMessageLine("4 - mobil 1 jam $100");
screen.displayMessageLine("5 - mobil 3 jam $200");
screen.displayMessageLine("6 - mobil >3 jam $300");
screen.displayMessageLine("7 - Cancel Transaction");
screen.displayMessage("\nPilih durasi Anda : ");
int input = keypad.getInput();
price = input;
switch(input){
case 1 :
case 2 :
case 3 :
case 4 :
case 5 :
userChoice = amounts[input];
break;
case CANCELED :
userChoice = CANCELED;
break;
default :
screen.displayMessageLine("\nInvalid selection.");
screen.displayMessageLine("Try again.");
}
}
return userChoice;
}
}
7. BalanceInquiry
= mengeluarkan output jumlah saldo
public class BalanceInquiry extends Transaction{
public BalanceInquiry(int userAccountNumber, Screen gtoScreen, BankDatabase gtoBankDatabase){
super(userAccountNumber, gtoScreen, gtoBankDatabase);
}
@Override
public void execute(){
BankDatabase bankDatabase = getBankDatabase();
Screen screen = getScreen();
double availableBalance = bankDatabase.getAvailableBalance(getAccountNumber());
screen.displayMessageLine("\nBalance Information : \n");
screen.displayMessage(" - Available Balance : ");
screen.displayDollarAmount(availableBalance);
screen.displayMessageLine("");
}
}
8. BankDatabase
= menyimpan id dan saldo
public class BankDatabase{
private Account[] accounts;
public BankDatabase(){
accounts = new Account[1];
accounts[0] = new Account(79344, 200.0);
}
private Account getAccount(int accountNumber){
for(Account currentAccount : accounts){
if(currentAccount.getAccountNumber() == accountNumber) return currentAccount;
}
return null;
}
public boolean authenticateUser(int userAccountNumber){
Account userAccount = getAccount(userAccountNumber);
if(userAccount != null){
return true;
}
else{
return false;
}
}
public double getAvailableBalance(int userAccountNumber){
return getAccount(userAccountNumber).getAvailableBalance();
}
public void debit(int userAccountNumber, double amount){
getAccount(userAccountNumber).debit(amount);
}
}
9. Account
=mengecek input yang masuk dan memanggil fungsi nilai saldo
public class Account{
private int accountNumber;
private double availableBalance;
public Account(int theAccountNumber, double theAvailableBalance){
accountNumber = theAccountNumber;
availableBalance = theAvailableBalance;
}
public double getAvailableBalance(){
return availableBalance;
}
public void debit(double amount){
availableBalance -= amount;
}
public int getAccountNumber(){
return accountNumber;
}
}
10. GTOCasestudy
= memanggil ulang fungsi main
public class GTOCaseStudy{
public static void main(String[] args){
GTO theGTO = new GTO();
theGTO.run();
}
}
Tidak ada komentar:
Posting Komentar