Proxy Pattern
The proxy pattern defines how to get object level access control by acting as a pass through entity or a placeholder object. There are three types in the proxy pattern.
(1) Remote Proxy:
Remote proxy represents an object locally which belongs to a different remote location.
Real Life Example:
ATM is remote proxy for the banks.
(2) Virtual Proxy:
When an object is complex or heavy, We can use a virtual proxy object as a skeleton representation for the original object.
Real Life Example:
Bank Cheques are the Virtual Proxy for the Currency Notes.
(3) Protection Proxy:
When we use a proxy to restrict the access of object it's called Protection proxy.
Real Life Example:
Proxy servers used in office and organizations to block the access of some websites and networks
Java Code Example:
Below is the java code example for the ATM Bank Implementation(Remote Proxy). The below code is not very good and secure for sophisticated banking system and only intended to illustrate the design pattern.
Utility Classes
//User public class User { String name; String email; Account account; public User(String name, String email,Account acc){ this.name = name; this.email = email; this.account = acc; } } //Account public class Account { private String accNo; private double amount; private ATMCard card; public static int pCount = 1111; public static int cardCount = 9999999; public Account(String acc){ this.accNo = acc; this.amount = 0.0; this.card = new ATMCard(acc, pCount++, String.valueOf(cardCount++)); } //Getters and Setters public String getAccNo() { return accNo; } public void setAccNo(String accNo) { this.accNo = accNo; } public double getAmount() { return amount; } public void setAmount(double amount) { this.amount = amount; } public ATMCard getCard() { return card; } public void setCard(ATMCard card) { this.card = card; } } //ATM Card public class ATMCard { private int pin; private String accNo; private String cardNo; public ATMCard(String acc, int p, String cardNo){ this.pin = p; this.accNo = acc; this.cardNo = cardNo; } public int getPin() { return pin; } public void setPin(int pin) { this.pin = pin; } public String getAccNo() { return accNo; } public void setAccNo(String accNo) { this.accNo = accNo; } public String getCardNO() { return cardNo; } public void setCardNO(String cardNo) { this.cardNo = cardNo; } }
Core Implementation
public interface Banking { void displayBal(User user); void deposit(User user,double amt); void withdraw(User user,double amt); } public class CoreBanking implements Banking { public String bankGroup = "ITB"; public void displayBal(User user){ System.out.println("Your current bal is : "+user.account.getAmount()); } public void deposit(User user, double amt){ double cur = user.account.getAmount(); cur += amt; user.account.setAmount(cur); System.out.println("Your updated current bal is : $"+user.account.getAmount()); } public void withdraw(User user, double amt){ double cur = user.account.getAmount(); if(cur >= amt){ cur -= amt; }else{ System.out.println("Your current balance is low, Please select a lower amount"); } user.account.setAmount(cur); System.out.println("Your updated current bal is : $"+user.account.getAmount()); } } import java.util.ArrayList; public class Bank extends CoreBanking { String branchCode; ArrayListuserList = new ArrayList (); public static int accNoCounter = 12345; public Bank(String bc){ this.branchCode = bc; // add user 1 this.addUser("Amit", "amit@mail.com"); // add use 2 this.addUser("Sumit", "sumit@mail.com"); } public void addUser(String name, String email){ User user = new User(name, email, new Account(String.valueOf(accNoCounter++))); userList.add(user); } } public class BankATM extends CoreBanking { String atmId; public BankATM(String atmId){ this.atmId = atmId; } } //Main Class import java.util.Scanner; public class Transaction { public static void main(String... args){ //Initialize a dummy bank Bank bank = new Bank("GGN-01");//IT Bank Gurgaon display(bank); BankATM atm = new BankATM("ggn-01"); User user = null; System.out.println("Press 0 for on-site Banking and 1 for ATM Banking "); Scanner sc = new Scanner(System.in); int flag = sc.nextInt(); if(flag == 0){//On-site Banking System.out.println("Enter your account number:"); String aac = sc.next(); for(User u : bank.userList){ if(u.account.getAccNo().equalsIgnoreCase(aac)){ user = u; System.out.println("Welcome! "+u.name.toUpperCase()+" in branch "+ bank.branchCode+" of "+bank.bankGroup+" Group of Banking"); executeTransactions(bank,user); break; } } if(user == null){ System.out.println("Wrong aac no. entered"); return; } }else if(flag == 1){//ATM-Banking | A proxy for Banks System.out.println("Enter your 4 digit ATM pin:"); int pin = sc.nextInt(); for(User u : bank.userList){ if(pin == u.account.getCard().getPin()){ user = u; System.out.println("Welcome! "+u.name.toUpperCase()+" in ATM "+atm.atmId+ " of "+bank.bankGroup+" Group of Banking"); executeTransactions(atm,user); break; } } if(user == null){ System.out.println("Wrong PIN entered"); return; } }else{//Unknown Choice selected System.out.println("You have selected a unkown choice"); } } public static void display(Bank bank){ System.out.println("List of Customers with details"); System.out.println("-----------------------------------------------------------------------"); for (User user : bank.userList) { System.out.println("Name : " + user.name); System.out.println("Email : " + user.email); System.out.println("Acc : " + user.account.getAccNo()); System.out.println("ATM Pin : "+ user.account.getCard().getPin()); System.out.println("Bal : $" + user.account.getAmount()); System.out.println("-----------------------------------------------------------------------"); } } public static void executeTransactions(Banking type, User user){ if(type instanceof Bank){ System.out.println("Transactions processing in On-Site Bank"); }else{ System.out.println("Transactions processing in the ATM"); } type.deposit(user, 500); type.withdraw(user, 80); type.withdraw(user, 499); } }
Comments
Post a Comment