Proxy Pattern - Controlling access to objects by providing a surrogate


In software engineering, the Proxy pattern is a structural design pattern that controls the access to objects by providing a surrogate or placeholder for another object. It acts as an intermediary between the client and the actual object, allowing additional functionalities to be added to the object's access control without altering its original code. The proxy class acts as a protective barrier, facilitating controlled access to the real object while hiding its complexities and enhancing its functionality.

Understanding the Proxy Pattern

The Proxy pattern consists of three main components:

  1. Real Subject: This represents the actual object that the client intends to access.
  2. Proxy: This acts as the interface to the client, hiding the real subject and controlling its access.
  3. Client: This interacts with the Proxy to access the real subject.

The Proxy pattern provides a way to control the access to the real subject, allowing for additional actions to be performed, such as logging, caching, or security checks, before or after accessing the actual object. It also allows lazy instantiation of the real subject, delaying its creation until it is really needed.

Benefits and Use Cases

By implementing the Proxy pattern, developers can achieve several benefits, including:

  1. Improved performance: Proxy objects can cache results, reducing the overhead of frequent expensive method calls.
  2. Simplified client code: The proxy class encapsulates the complex operations, providing a simpler interface to the client.
  3. Enhanced security: Proxies can enforce access control policies, ensuring that only authorized clients can access the real subject.
  4. Logging and auditing: Proxies can log method invocations, aiding in debugging and auditing purposes.
  5. Remote execution: Proxies can act as a gateway for accessing remote objects, allowing interaction with objects residing in different systems or networks.

The Proxy pattern finds application in various scenarios, such as:

  • Virtual Proxies: These create expensive objects on demand, eliminating the need for immediate initialization.
  • Protection Proxies: These provide access control mechanisms, ensuring that only authorized clients can access sensitive or restricted objects.
  • Remote Proxies: These enable transparent interaction with objects residing in remote systems or networks.
  • Smart Proxies: These add additional functionalities to the real object, such as caching, logging, or lazy loading, without modifying its code.

Example: Image Proxy

A commonly used example to illustrate the Proxy pattern is an Image Proxy. Suppose we have a system that loads and displays images, but we want to optimize the loading process by delaying it until the image is actually needed. In this case, we can use a Proxy to act as a surrogate for the actual image object.

The Image Proxy is responsible for managing the image's loading and displaying. When the client requests an image, the Proxy will check if the actual image object has been loaded. If not, it will load the image from disk or a network location. Once the image is loaded, the Proxy will delegate the display operation to the real image object. This way, the client interacts with the Proxy, unaware of whether the image is loaded or not.


The Proxy pattern is a powerful tool for controlling access to objects by providing a surrogate or placeholder. It allows for additional functionality to be added, such as caching, security checks, remote execution, or lazy instantiation, without modifying the original code of the real object. By using the Proxy pattern, developers can enhance the performance, security, and simplicity of their applications, while effectively managing complex object interactions.

noob to master © copyleft