Замісник (Proxy)
Замість оригінального об'єкту підставити дублюючий об'єкт з таким самим інтерфейсом і додатковим прихованим функціоналом
Замісник контролює доступ до оригінального об'єкту
Замісник має посилання на оригінальний об'єкт
1. Ледачій проксі (virtual proxy) - коли оригінальний об'єкт потребує багато ресурсів, і його можна створити лише тоді, коли він знадобиться (якщо взагалі знадобиться)
2. Захисний проксі - замінник при кожному визові перевіряє чи доступ дозволено
3. Віддалений проксі - замінник переводить запити клієнта у мережеві запити
4. Розумне посилання - замінник підраховує кількість посилань на об'єкт
5. Кешуючий проксі - замінник зберігає проміжні данні до передачі їх клієнту
6. Логуючий проксі - замінник зберігає історію запитів до оригінального об'єкту
public interface ISubject
{
void Request();
}
class RealSubject : ISubject
{
public void Request()
{
Console.WriteLine("RealSubject: Handling Request");
}
}
class Proxy : ISubject
{
private RealSubject _realSubject;
public Proxy(RealSubject realSubject)
{
this._realSubject = realSubject;
}
public void Request()
{
if (this.CheckAccess())
{
this._realSubject.Request();
this.LogAccess();
}
}
public bool CheckAccess()
{
Console.WriteLine("Proxy: Checking access");
return true;
}
public void LogAccess()
{
Console.WriteLine("Proxy: Logging the time of request");
}
}
public class Client // Можна і без нього
{
// The client code is supposed to work with all objects (both subjects
// and proxies)
public void ClientCode(ISubject subject)
{
// ...
subject.Request();
// ...
}
}
static void Main(string[] args)
{
Client client = new Client();
Console.WriteLine("Client - real subject:");
RealSubject realSubject = new RealSubject();
client.ClientCode(realSubject);
Console.WriteLine();
Console.WriteLine("Client - proxy:");
Proxy proxy = new Proxy(realSubject);
client.ClientCode(proxy);
Console.ReadKey();
}
Client - real subject:
RealSubject: Handling Request
Client - proxy:
Proxy: Checking access
RealSubject: Handling Request
Proxy: Logging the time of request