Skip to main content

Proxy Pattern : Real Life Example and Java Code Example

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;
 ArrayList userList = 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

Popular posts from this blog

How to Create a Namespace in Aerospike Database

                      T his post is about creating a namespace in Aerospike. I could not find any concrete method to create a namespace like create database in MySQL and MongoDB. So I am suggesting a way to create a namespace in Aerospike Database. Step-1: Locate config file aerospike.conf and open it in your favorite editor and make sure you have permission to modify the file. In my system the path of file /etc/aerospike/aerospike.conf (Default in Ubuntu). Here the content of the file. # Aerospike database configuration file. service { user root group root paxos-single-replica-limit 1 # Number of nodes where the replica pidfile /var/run/aerospike/asd.pid service-threads 4 transaction-queues 4 transaction-threads-per-queue 4 proto-fd-max 15000 } logging { # Log file must be an absolute path. file /var/log/aerospike/aerospike.log { context any info } } network { service { address any port 3000 } heartbeat { mode multicast address 239.1.99.222 p

java.lang.IllegalArgumentException: Could not instantiate implementation: org.janusgraph.diskstorage.cassandra.thrift.CassandraThriftStoreManager

If you are trying to get started with Janus Graph with Apache Cassandra. You may get the following error. Caused by: org.janusgraph.diskstorage.TemporaryBackendException: Temporary failure in storage backend at org.janusgraph.diskstorage.cassandra.thrift.CassandraThriftStoreManager.getCassandraPartitioner(CassandraThriftStoreManager.java:219) ~[janusgraph-cassandra-0.2.0.jar:na] at org.janusgraph.diskstorage.cassandra.thrift.CassandraThriftStoreManager.<init>(CassandraThriftStoreManager.java:198) ~[janusgraph-cassandra-0.2.0.jar:na] ... 48 common frames omitted Caused by: org.apache.thrift.transport.TTransportException: java.net.ConnectException: Connection refused (Connection refused) at org.apache.thrift.transport.TSocket.open(TSocket.java:187) ~[libthrift-0.9.2.jar:0.9.2] at org.apache.thrift.transport.TFramedTransport.open(TFramedTransport.java:81) ~[libthrift-0.9.2.jar:0.9.2] at org.janusgraph.diskstorage.cassandra.thrift.thriftpool.CTConnectionFactory.makeR

com.mongodb.MongoCommandException: Command failed with error 18: 'Authentication failed.' on server

If you are trying to connect Mongo DB Server and it insanely throwing following error. com.mongodb.MongoTimeoutException : Timed out after 1000 ms while waiting for a server that matches ReadPreferenceServerSelector{readPreference=primary}. Client view of cluster state is {type=UNKNOWN, servers=[{address=192.168.1.10:27010, type=UNKNOWN, state=CONNECTING, exception={ com.mongodb.MongoSecurityException: Exception authenticating MongoCredential {mechanism=null, userName='user123', source='admin', password=<hidden>, mechanismProperties={}}}, caused by {com.mongodb.MongoCommandException: Command failed with error 18 : 'Authentication failed.' on server 192.168.1.10:27010 . The full response is { "ok" : 0.0, "code" : 18, "errmsg" : "Authentication failed." }}}] If you start looking the error content First you encounter with Timeout Exception which may mislead you. It is basically an authentication error. I