Статья
Шаблон проектирования "Заместитель"

Шаблон проектирования "Заместитель"

3 мая 2020

Относится к структурным шаблонам.

Другое название - "Прокси" (Proxy).
Частым применением данного шаблона является "ленивая загрузка" ("lazy load").


Пример на PHP

Пусть имеется интерфейс IData и класс Data

interface IData {
    public function calc(int $x);
}

class Data implements IData
{
    public function __construct() 
    {
        // ресурсоемкие вычисления
    }

    public function calc(int $x = 0)
    {
    }
}

Создадим "DataProxy":

class DataProxy implements IData
{
    protected $data = null;

    public function calc(int $x = 0)
    {
        if ($this->data === null) {
            $this->data = new Data();
        }

        return $this->data->calc($x);
    }
}

Использование:

$proxy = new DataProxy();
$proxy->calc(5); // Выполняются ресурсоемкие вычисления
$proxy->calc(10); // Используются ранее рассчитанные значения


Пример на Go

package main

type IData interface {
   Calc(x int)
}

type Data struct {
}

func (d *Data) Calc(x int) {
}

type DataProxy struct {
   data *Data
}

func (d *DataProxy) Calc(x int) {
   if d.data == nil {
      d.data = &Data{}
   }
   
   d.data.Calc(x)
}

func main() {
   proxy := DataProxy{}
   proxy.Calc(5)
   proxy.Calc(10)
}


Источники:
http://designpatternsphp.readthedocs.io/ru/latest/Structural/Proxy/README.html
https://habrahabr.ru/company/mailru/blog/325492/