Proxy Design pattern falls under Structural Pattern of Gang of Four (GOF) Design Patterns in .Net. The proxy design pattern is used to provide a surrogate object, which references to other objects. In this article, I would like to share what is a proxy pattern and how is it work?
The proxy design pattern is used to provide a surrogate object, which references to other objects.
The proxy pattern involves a class, called proxy class, which represents the functionality of another class.
The UML class diagram for the implementation of the proxy design pattern is given below:

The classes, interfaces, and objects in the above UML class diagram are as follows:
This is an interface having members that will be implemented by RealSubject and Proxy class.
This is a class which we want to use more efficiently by using proxy class.
This is a class which holds the instance of RealSubject class and can access RealSubject class members as required.
public interface Subject
{
 void PerformAction();
}
public class RealSubject : Subject
{
 public void PerformAction()
 {
 Console.WriteLine("RealSubject action performed.");
 }
}
public class Proxy : Subject
{
 private RealSubject _realSubject;
 public void PerformAction()
 {
 if (_realSubject == null)
 _realSubject = new RealSubject();
 _realSubject.PerformAction();
 }
}

The classes, interfaces, and objects in the above class diagram can be identified as follows:
IClient- Subject Interface.
RealClient - RealSubject Class.
ProxyClient - Proxy Class.
/// <summary>
/// The 'Subject interface
/// </summary>
public interface IClient
{
 string GetData();
}
/// <summary>
/// The 'RealSubject' class
/// </summary>
public class RealClient : IClient
{
 string Data;
 public RealClient()
 {
 Console.WriteLine("Real Client: Initialized");
 Data = "Dot Net Tricks";
 }
 public string GetData()
 {
 return Data;
 }
}
/// <summary>
/// The 'Proxy Object' class
/// </summary>
public class ProxyClient : IClient
{
 RealClient client = new RealClient();
 public ProxyClient()
 {
 Console.WriteLine("ProxyClient: Initialized");
 }
 public string GetData()
 {
 return client.GetData();
 }
}
/// <summary>
/// Proxy Pattern Demo
/// </summary>
class Program
{
 static void Main(string[] args)
 {
 ProxyClient proxy = new ProxyClient();
 Console.WriteLine("Data from Proxy Client = {0}", proxy.GetData());
 Console.ReadKey();
 }
}

There are various kinds of proxies, some of them are as follows:
Virtual proxies: Hand over the creation of an object to another object
Authentication proxies: Checks the access permissions for a request
Remote proxies: Encodes requests and send them across a network
Smart proxies: Change requests before sending them across a network
Objects need to be created on demand means when their operations are requested.
Access control for the original object is required.
Allow accessing a remote object by using a local object(it will refer to a remote object).