# Proxy (aka Surrogate)

## Intent

* Provide a surrogate or placeholder for another object to control access to it.

## Problem

* How can the access to an object be controlled?
* How can additional functionality be provided when accessing an object?

## Solution

* Define a separate Proxy object that acts as substitute for another object _(Subject)_.
* Work through a Proxy object to control the access to a real subject.

## Types of Proxy

* Remote Proxy
* Virtual Proxy
* Protection Proxy
* Caching Proxy
* Smart Proxy

## Advantages

✅ You can control the service object without clients knowing about it.\
✅ You can manage the lifecycle of the service object when clients don’t care about it.\
✅ The proxy works even if the service object isn’t ready or is not available.\
✅ Open/Closed Principle. You can introduce new proxies without changing the service or clients.\


## Disadvantages

❌ The code may become more complicated since you need to introduce a lot of new classes.\
❌ The response from the service might get delayed.\


## Notes

* Proxy pattern is also known as **Surrogate pattern**.
* Some common operations done through proxy pattern includes,
  * May hide information about the real object to the client.
  * May perform optimization like on demand loading.
  * May do additional house-keeping job like audit tasks.
* [Decorator v/s Proxy](https://doeken.org/blog/decorator-vs-proxy-pattern)
