Java - Design Pattern - Proxy

From My Limbic Wiki

Proxy is a structural design pattern that provides an object that acts as a substitute for a real service object used by a client. A proxy receives client requests, does some work (access control, caching, etc.) and then passes the request to a service object.

Let's talk about when to use the Proxy pattern:

  • When we want a simplified version of a complex or heavy object. In this case, we may represent it with a skeleton object which loads the original object on demand, also called as lazy initialization. This is known as the Virtual Proxy
  • When the original object is present in different address space, and we want to represent it locally. We can create a proxy which does all the necessary boilerplate stuff like creating and maintaining the connection, encoding, decoding, etc., while the client accesses it as it was present in their local address space. This is called the Remote Proxy
  • When we want to add a layer of security to the original underlying object to provide controlled access based on access rights of the client. This is called Protection Proxy

It is an error to try to create a scoped proxy for a singleton bean (and the resulting BeanCreationException will certainly set you straight in this regard). <source lang="Java"> public interface ExpensiveObject {

   void process();

} public class ExpensiveObjectImpl implements ExpensiveObject {

   public ExpensiveObjectImpl() {
       heavyInitialConfiguration();
   }
    
   @Override
   public void process() {
       LOG.info("processing complete.");
   }
    
   private void heavyInitialConfiguration() {
       LOG.info("Loading initial configuration...");
   }
    

} public class ExpensiveObjectProxy implements ExpensiveObject {

   private static ExpensiveObject object;

   @Override
   public void process() {
       if (object == null) {
           object = new ExpensiveObjectImpl();
       }
       object.process();
   }

} public static void main(String[] args) {

   ExpensiveObject object = new ExpensiveObjectProxy();
   object.process();
   object.process();

}

/** Result: Loading initial configuration... processing complete. processing complete.

  • /

</source>