Замісник (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