Implement Own Implementation of State Design Pattern through Revisiting Previous Assessment
parent
9ee08e7713
commit
fbe7e2294d
@ -0,0 +1,118 @@
|
|||||||
|
package bank.assessment;
|
||||||
|
|
||||||
|
import bank.assessment.states.BankAccountStates;
|
||||||
|
import bank.assessment.states.NotCreatedState;
|
||||||
|
|
||||||
|
public abstract class BankAccount {
|
||||||
|
|
||||||
|
private String username, password, accountNumber, sortCode;
|
||||||
|
private double balance;
|
||||||
|
private double overdraftLimit;
|
||||||
|
|
||||||
|
BankAccountStates bankAccountState;
|
||||||
|
|
||||||
|
BankAccount() { this.bankAccountState = NotCreatedState.getInstance(this); }
|
||||||
|
|
||||||
|
BankAccount(String username, String password, String accountNumber, String sortCode) {
|
||||||
|
this.username = username;
|
||||||
|
this.password = password;
|
||||||
|
this.accountNumber = accountNumber;
|
||||||
|
this.sortCode = sortCode;
|
||||||
|
this.bankAccountState = NotCreatedState.getInstance(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public BankAccount(String username, String password, String accountNumber, String sortCode, double overdraftLimit) {
|
||||||
|
this.username = username;
|
||||||
|
this.password = password;
|
||||||
|
this.accountNumber = accountNumber;
|
||||||
|
this.sortCode = sortCode;
|
||||||
|
this.overdraftLimit = overdraftLimit;
|
||||||
|
this.bankAccountState = NotCreatedState.getInstance(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Method Actions To Change State
|
||||||
|
public void changeBankAccountState(BankAccountStates bankAccountState) { this.bankAccountState = bankAccountState; }
|
||||||
|
|
||||||
|
public void createAccount(Person person) { this.bankAccountState.createAccount(person); }
|
||||||
|
|
||||||
|
public void logIn() { this.bankAccountState.logIn(); }
|
||||||
|
|
||||||
|
public void logOut() {
|
||||||
|
this.bankAccountState.logOut();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void deposit() { this.bankAccountState.deposit(); }
|
||||||
|
|
||||||
|
public boolean withdraw() { return this.bankAccountState.withdraw(); }
|
||||||
|
|
||||||
|
public void viewDetails() {
|
||||||
|
this.bankAccountState.viewDetails();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void deleteAccount() { this.bankAccountState.deleteAccount(); }
|
||||||
|
|
||||||
|
// Getters & Setters
|
||||||
|
public String getUsername() {
|
||||||
|
return username;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUsername(String username) {
|
||||||
|
this.username = username;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPassword() {
|
||||||
|
return password;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPassword(String password) {
|
||||||
|
this.password = password;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAccountNumber() {
|
||||||
|
return accountNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAccountNumber(String accountNumber) {
|
||||||
|
this.accountNumber = accountNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSortCode() {
|
||||||
|
return sortCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSortCode(String sortCode) {
|
||||||
|
this.sortCode = sortCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getBalance() {
|
||||||
|
return balance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBalance(double balance) {
|
||||||
|
this.balance = balance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getOverdraftLimit() {
|
||||||
|
return overdraftLimit;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOverdraftLimit(double overdraftLimit) {
|
||||||
|
this.overdraftLimit = overdraftLimit;
|
||||||
|
}
|
||||||
|
|
||||||
|
void displayBalance() {
|
||||||
|
System.out.println("Current Account Balance: " + balance);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "BankAccount{" +
|
||||||
|
"username='" + username + '\'' +
|
||||||
|
", password='" + password + '\'' +
|
||||||
|
", accountNumber='" + accountNumber + '\'' +
|
||||||
|
", sortCode='" + sortCode + '\'' +
|
||||||
|
", balance=" + String.format("£%.2f", balance) +
|
||||||
|
", overdraftLimit=" + String.format("£%.2f", overdraftLimit) +
|
||||||
|
'}';
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,14 @@
|
|||||||
|
package bank.assessment;
|
||||||
|
|
||||||
|
public class BasicAccount extends BankAccount {
|
||||||
|
|
||||||
|
public BasicAccount() { }
|
||||||
|
|
||||||
|
public BasicAccount(String username, String password, String accountNumber, String sortCode) {
|
||||||
|
super(username, password, accountNumber, sortCode);
|
||||||
|
}
|
||||||
|
|
||||||
|
public BasicAccount(String username, String password, String accountNumber, String sortCode, double overdraftLimit) {
|
||||||
|
super(username, password, accountNumber, sortCode, overdraftLimit);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
package bank.assessment;
|
||||||
|
|
||||||
|
import java.util.Scanner;
|
||||||
|
|
||||||
|
public class Console {
|
||||||
|
public static final Scanner INPUT = new Scanner(System.in);
|
||||||
|
}
|
@ -0,0 +1,60 @@
|
|||||||
|
package bank.assessment;
|
||||||
|
|
||||||
|
public class Main {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
|
||||||
|
// Note:
|
||||||
|
// For the first time in my life. This project will include no error handling for the
|
||||||
|
// user inputs because the focus of the project is the design. Not going to handle any users that are "dumb" :)
|
||||||
|
|
||||||
|
Person person = new Person();
|
||||||
|
person.setBankAccount(new BasicAccount());
|
||||||
|
getPersonDetails(person);
|
||||||
|
|
||||||
|
int choice;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
System.out.println("""
|
||||||
|
|
||||||
|
Welcome Glasgow University Banking\s
|
||||||
|
|
||||||
|
Press 1: Register With Us
|
||||||
|
Press 2: Log In
|
||||||
|
Press 3: View Details
|
||||||
|
Press 4: Deposit Money
|
||||||
|
Press 5: Withdraw Money
|
||||||
|
Press 6: Log Out
|
||||||
|
Press 7: Delete Account
|
||||||
|
Press 8: Quit
|
||||||
|
""");
|
||||||
|
choice = Integer.parseInt(Console.INPUT.nextLine());
|
||||||
|
|
||||||
|
switch (choice) {
|
||||||
|
case 1 -> person.getBankAccount().createAccount(person);
|
||||||
|
case 2 -> person.getBankAccount().logIn();
|
||||||
|
case 3 -> person.getBankAccount().viewDetails();
|
||||||
|
case 4 -> person.getBankAccount().deposit();
|
||||||
|
case 5 -> person.getBankAccount().withdraw();
|
||||||
|
case 6 -> person.getBankAccount().logOut();
|
||||||
|
case 7 -> person.getBankAccount().deleteAccount();
|
||||||
|
}
|
||||||
|
} while (choice != 8);
|
||||||
|
|
||||||
|
System.out.println("Thank You For Using Glasgow University Banking! We Hope to See You Soon :D");
|
||||||
|
System.exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void getPersonDetails(Person person) {
|
||||||
|
System.out.println("What is Your Forename?");
|
||||||
|
person.setForename(Console.INPUT.nextLine());
|
||||||
|
|
||||||
|
System.out.println("What is Your Surname?");
|
||||||
|
person.setSurname(Console.INPUT.nextLine());
|
||||||
|
|
||||||
|
System.out.println("What is Your Email Address?");
|
||||||
|
person.setEmailAddress(Console.INPUT.nextLine());
|
||||||
|
|
||||||
|
System.out.println("What is Your Date of Birth? (Format: DD/MM/YYYY)");
|
||||||
|
person.setDateOfBirth(Console.INPUT.nextLine());
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,65 @@
|
|||||||
|
package bank.assessment;
|
||||||
|
|
||||||
|
public class Person {
|
||||||
|
|
||||||
|
private String forename, surname, emailAddress, dateOfBirth;
|
||||||
|
private BankAccount bankAccount;
|
||||||
|
|
||||||
|
public Person() { }
|
||||||
|
|
||||||
|
public Person(String forename, String surname, String emailAddress, String dateOfBirth) {
|
||||||
|
this.forename = forename;
|
||||||
|
this.surname = surname;
|
||||||
|
this.emailAddress = emailAddress;
|
||||||
|
this.dateOfBirth = dateOfBirth;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getForename() {
|
||||||
|
return forename;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setForename(String forename) {
|
||||||
|
this.forename = forename;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSurname() {
|
||||||
|
return surname;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSurname(String surname) {
|
||||||
|
this.surname = surname;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getEmailAddress() {
|
||||||
|
return emailAddress;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEmailAddress(String emailAddress) { this.emailAddress = emailAddress; }
|
||||||
|
|
||||||
|
public String getDateOfBirth() {
|
||||||
|
return dateOfBirth;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDateOfBirth(String dateOfBirth) {
|
||||||
|
this.dateOfBirth = dateOfBirth;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BankAccount getBankAccount() {
|
||||||
|
return bankAccount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBankAccount(BankAccount bankAccount) {
|
||||||
|
this.bankAccount = bankAccount;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "Person{" +
|
||||||
|
"forename='" + forename + '\'' +
|
||||||
|
", surname='" + surname + '\'' +
|
||||||
|
", emailAddress='" + emailAddress + '\'' +
|
||||||
|
", dateOfBirth='" + dateOfBirth + '\'' +
|
||||||
|
", bankAccount=" + bankAccount +
|
||||||
|
'}';
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,26 @@
|
|||||||
|
package bank.assessment;
|
||||||
|
|
||||||
|
public class PremiumAccount extends BasicAccount {
|
||||||
|
|
||||||
|
public PremiumAccount(String username, String password, String accountNumber, String sortCode, double overdraftLimit) {
|
||||||
|
super(username, password, accountNumber, sortCode, overdraftLimit);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean withdraw() {
|
||||||
|
System.out.println("How Much Money Do You Want To Withdraw?");
|
||||||
|
double amount = Double.parseDouble(Console.INPUT.nextLine());
|
||||||
|
|
||||||
|
if (amount <= (getBalance() + getOverdraftLimit())) {
|
||||||
|
setBalance(getBalance() - amount);
|
||||||
|
|
||||||
|
System.out.println("Withdraw Successful!");
|
||||||
|
displayBalance();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
System.out.println("Insufficient Funds Available to Withdraw! Try Again!");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,15 @@
|
|||||||
|
package bank.assessment.states;
|
||||||
|
|
||||||
|
import bank.assessment.Person;
|
||||||
|
|
||||||
|
public interface BankAccountStates {
|
||||||
|
|
||||||
|
void createAccount(Person person);
|
||||||
|
void logIn();
|
||||||
|
void logOut();
|
||||||
|
void deposit();
|
||||||
|
boolean withdraw();
|
||||||
|
void viewDetails();
|
||||||
|
void deleteAccount();
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,63 @@
|
|||||||
|
package bank.assessment.states;
|
||||||
|
|
||||||
|
import bank.assessment.BankAccount;
|
||||||
|
import bank.assessment.Console;
|
||||||
|
import bank.assessment.Person;
|
||||||
|
|
||||||
|
public class LoggedInState implements BankAccountStates {
|
||||||
|
|
||||||
|
BankAccount bankAccount;
|
||||||
|
private static LoggedInState instance;
|
||||||
|
|
||||||
|
private LoggedInState(BankAccount bankAccount) {
|
||||||
|
this.bankAccount = bankAccount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static LoggedInState getInstance(BankAccount bankAccount) {
|
||||||
|
return instance == null ? instance = new LoggedInState(bankAccount) : instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void createAccount(Person person) {
|
||||||
|
System.out.println("This Account Is Already Registered With Us. Please Log In!");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void logIn() {
|
||||||
|
System.out.println("You Are Already Logged In!");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void logOut() {
|
||||||
|
// Log out!
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void deposit() {
|
||||||
|
System.out.println("How Much Money Do You Want To Deposit?");
|
||||||
|
double cashToDeposit = Double.parseDouble(Console.INPUT.nextLine());
|
||||||
|
|
||||||
|
if (cashToDeposit >= 0) {
|
||||||
|
bankAccount.setBalance(bankAccount.getBalance() + cashToDeposit);
|
||||||
|
} else {
|
||||||
|
System.out.println("Amount Entered Not Valid! Try Again!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean withdraw() {
|
||||||
|
return bankAccount.withdraw();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void viewDetails() {
|
||||||
|
System.out.println("Your Current Bank Details:");
|
||||||
|
System.out.println(bankAccount);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void deleteAccount() {
|
||||||
|
bankAccount.changeBankAccountState(NotCreatedState.getInstance(bankAccount));
|
||||||
|
System.out.println("Account Deleted! We're Sad To See You Go :(");
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,72 @@
|
|||||||
|
package bank.assessment.states;
|
||||||
|
|
||||||
|
import bank.assessment.BankAccount;
|
||||||
|
import bank.assessment.BasicAccount;
|
||||||
|
import bank.assessment.Console;
|
||||||
|
import bank.assessment.Person;
|
||||||
|
|
||||||
|
public class LoggedOutState implements BankAccountStates {
|
||||||
|
|
||||||
|
BankAccount bankAccount;
|
||||||
|
private static LoggedOutState instance;
|
||||||
|
|
||||||
|
private LoggedOutState(BankAccount bankAccount) {
|
||||||
|
this.bankAccount = bankAccount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static LoggedOutState getInstance(BankAccount bankAccount) {
|
||||||
|
return instance == null ? instance = new LoggedOutState(bankAccount) : instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void createAccount(Person person) {
|
||||||
|
System.out.println("You Have Already Created An Account!");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void logIn() {
|
||||||
|
System.out.println("Please Enter Your Login Username: ");
|
||||||
|
String loginUsername = Console.INPUT.nextLine();
|
||||||
|
|
||||||
|
System.out.println("Please Enter Your Login Password: ");
|
||||||
|
String loginPassword = Console.INPUT.nextLine();
|
||||||
|
|
||||||
|
if (!bankAccount.getUsername().equalsIgnoreCase(loginUsername) || !bankAccount.getPassword().equalsIgnoreCase(loginPassword)) {
|
||||||
|
System.out.println("Uh Oh Error! Incorrect Username Or Password Entered!");
|
||||||
|
} else {
|
||||||
|
System.out.printf("Welcome Back '%s'", bankAccount.getUsername());
|
||||||
|
bankAccount.changeBankAccountState(LoggedInState.getInstance(bankAccount));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void logOut() {
|
||||||
|
System.out.println("You Have Already Logged Out! Please Log in!");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void deposit() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean withdraw() {
|
||||||
|
System.out.println("Please Log In Before Trying To Withdraw Funds!");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void viewDetails() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void deleteAccount() {
|
||||||
|
bankAccount = new BasicAccount();
|
||||||
|
System.out.println("Account Deleted! We're Sad To See You Go :(");
|
||||||
|
|
||||||
|
// Same as?
|
||||||
|
// bankAccount = new BasicAccount();
|
||||||
|
// System.out.println("Account Deleted! We're Sad To See You Go :(");
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,86 @@
|
|||||||
|
package bank.assessment.states;
|
||||||
|
|
||||||
|
import bank.assessment.*;
|
||||||
|
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
public class NotCreatedState implements BankAccountStates {
|
||||||
|
|
||||||
|
BankAccount bankAccount;
|
||||||
|
private final Random random = new Random();
|
||||||
|
private static NotCreatedState instance;
|
||||||
|
|
||||||
|
private NotCreatedState(BankAccount bankAccount) {
|
||||||
|
this.bankAccount = bankAccount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static NotCreatedState getInstance(BankAccount bankAccount) {
|
||||||
|
return instance == null ? instance = new NotCreatedState(bankAccount) : instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void createAccount(Person person) {
|
||||||
|
System.out.println("Please Enter in a Suitable Username: ");
|
||||||
|
String username = Console.INPUT.nextLine();
|
||||||
|
|
||||||
|
System.out.println("Please Enter in a Suitable Password: ");
|
||||||
|
String password = Console.INPUT.nextLine();
|
||||||
|
|
||||||
|
String accountNumber = String.valueOf(generateRandomNum(random, 100000, 999999));
|
||||||
|
String sortCode = generateRandomNum(random, 10, 99) + "-" + generateRandomNum(random, 10,99) + "-" + generateRandomNum(random, 10,99);
|
||||||
|
|
||||||
|
System.out.println("Would You Like A Premium Account? (Format Y/N)");
|
||||||
|
String choice = Console.INPUT.nextLine();
|
||||||
|
|
||||||
|
if (choice.equalsIgnoreCase("y")) {
|
||||||
|
System.out.println("What Would You Like Your Overdraft Limit To Be?");
|
||||||
|
String overdraftLimit = Console.INPUT.nextLine();
|
||||||
|
|
||||||
|
bankAccount = new PremiumAccount(username, password, accountNumber, sortCode, Double.parseDouble(overdraftLimit));
|
||||||
|
|
||||||
|
} else if (choice.equalsIgnoreCase("n")) {
|
||||||
|
bankAccount = new BasicAccount(username, password, accountNumber, sortCode);
|
||||||
|
}
|
||||||
|
|
||||||
|
System.out.println("Bank Account Successfully Created!");
|
||||||
|
System.out.println("Your Details Are: " + bankAccount);
|
||||||
|
|
||||||
|
bankAccount.changeBankAccountState(LoggedOutState.getInstance(bankAccount));
|
||||||
|
person.setBankAccount(bankAccount);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void logIn() {
|
||||||
|
System.out.println("Sorry, Our Systems Couldn't Find Your Details. Please Try Again or Register!");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void logOut() {
|
||||||
|
System.out.println("You Must Be Logged In Before You Can Log Out!");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void deposit() {
|
||||||
|
System.out.println("Sorry, Please Log In First Before Trying Deposit Cash!");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean withdraw() {
|
||||||
|
System.out.println("Sorry, Please Log In First Before Trying Withdraw Funds!");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void viewDetails() {
|
||||||
|
System.out.println("There Are No Account Details To View, Please Log In or Register!");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void deleteAccount() {
|
||||||
|
System.out.println("No Account Found To Delete, Please Log In!");
|
||||||
|
}
|
||||||
|
|
||||||
|
private int generateRandomNum(Random random, int lower, int upper) {
|
||||||
|
return lower + random.nextInt(upper) + 1;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue