Шаблон проектирования "Заместитель"
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/