Заместитель

Заместитель

Шаблон Proxy (Заместитель) — Шаблон проектирования. Предоставляет объект, контролирующий доступ, перехватывая все вызовы к нему.

Содержание

Цель

Проблема

Необходимо управлять доступом к объекту, так чтобы создавать громоздкие объекты «по требованию».

Решение

Создать суррогат громоздкого объекта. «Заместитель» хранит ссылку, которая позволяет заместителю обратиться к реальному субъекту (объект класса «Заместитель» может обращаться к объекту класса «Субъект», если интерфейсы «Реального Субъекта» и «Субъекта» одинаковы). Поскольку интерфейс «Реального Субъекта» идентичен интерфейсу «Субъекта», так, что «Заместителя» можно подставить вместо «Реального Субъекта», контролирует доступ к «Реальному Субъекту», может отвечать за создание или удаление «Реального Субъекта». «Субъект» определяет общий для «Реального Субъекта» и «Заместителя» интерфейс, так, что «Заместитель» может быть использован везде, где ожидается «Реальный Субъект». При необходимости запросы могут быть переадресованы «Заместителем» «Реальному Субъекту».

Диаграмма классов шаблона проектирования Proxy

Шаблон proxy бывает нескольких видов, а именно:

  • Удаленный: обеспечивает связь с «Субъектом» который находится в другом адресном пространстве или на удалённой машине. Так же может отвечать за кодирование запроса и его аргументов и отправку закодированного запроса реальному «Субъекту»,
  • Виртуальный: Обеспечивает создание реального «Субъекта» только тогда, когда он действительно понадобится. Так же может кэшировать часть информации о реальном «Субъекте», чтобы отложить его создание,
  • Копировать-при-записи:: Обеспечивает копирование «субъекта» при выполнении клиентом определённых действий. Частный случай «виртуального прокси»
  • Защищающий: может проверять, имеет ли вызывающий объект необходимые для выполнения запроса права.
  • Кеширующий прокси: Обеспечивает временное хранение результатов расчёта до отдачи множественным клиентам, которые могут разделить эти результаты.
  • Экранирующий прокси: Защищает «Субъект» от опасных клиентов (или наоборот).
  • Синхронизирующий прокси: Производит синхронизированный контроль доступа к «Субъекту» в асинхронной многопоточной среде.
  • Smart reference proxy: Производит дополнительные действиия когда на «Субъект» создается ссылка, например рассчитывает количество активных ссылок на «Субъект».

Плюсы

  •  удаленный заместитель;
  •  виртуальный заместитель может выполнять оптимизацию;
  •  защищающий заместитель;
  • "умная" ссылка;

Минусы

  • резкое увеличение времени отклика.

Применимость

Шаблон Proxy может применяться в таких случаях работы с сетевым соединением, огромным объектом в памяти (или на диске) или любым другим ресурсом который сложно или тяжело копировать. Хорошо известный пример применения — объект подсчитывающий число ссылок.

Примеры

public class Main {
 
	public static void main(String[] args) {
		// Create math proxy
		MathProxy p = new MathProxy();
 
		// Do the math
		System.out.println("4 + 2 = " + p.add(4, 2));
		System.out.println("4 - 2 = " + p.sub(4, 2));
		System.out.println("4 * 2 = " + p.mul(4, 2));
		System.out.println("4 / 2 = " + p.div(4, 2));
	}
}
 
/**
 * "Subject"
 */
public interface IMath {
 
	public double add(double x, double y);
 
	public double sub(double x, double y);
 
	public double mul(double x, double y);
 
	public double div(double x, double y);
}
 
/**
 * "Real Subject"
 */
public class Math implements IMath {
 
	public double add(double x, double y) {
		return x + y;
	}
 
	public double sub(double x, double y) {
		return x - y;
	}
 
	public double mul(double x, double y) {
		return x * y;
	}
 
	public double div(double x, double y) {
		return x / y;
	}
 
}
 
/**
 * "Proxy Object"
 */
public class MathProxy implements IMath {
 
	private Math math;
 
	public MathProxy() {
		math = new Math();
	}
 
	public double add(double x, double y) {
		return math.add(x, y);
	}
 
	public double sub(double x, double y) {
		return math.sub(x, y);
	}
 
	public double mul(double x, double y) {
		return math.mul(x, y);
	}
 
	public double div(double x, double y) {
		return math.div(x, y);
	}
}

C++

/**
 * "Subject"
 */
class IMath {
public:
    virtual double add(double x, double y) = 0;
    virtual double sub(double x, double y) = 0;
    virtual double mul(double x, double y) = 0;
    virtual double div(double x, double y) = 0;
};
 
/**
 * "Real Subject"
 */
class Math : public IMath {
public:
    double add(double x, double y) {
        return x + y;
    }
 
    double sub(double x, double y) {
        return x - y;
    }
 
    double mul(double x, double y) {
        return x * y;
    }
 
    double div(double x, double y) {
        return x / y;
    }
};
 
/**
 * "Proxy Object"
 */
class MathProxy : public IMath {
public:
    double add(double x, double y) {
        return math.add(x, y);
    }
 
    double sub(double x, double y) {
        return math.sub(x, y);
    }
 
    double mul(double x, double y) {
        return math.mul(x, y);
    }
 
    double div(double x, double y) {
        return math.div(x, y);
    }
 
private:
    Math math;
};
 
#include <iostream>
 
using std::cout;
using std::endl;
 
int main() {
 
    // Create math proxy
    MathProxy p;
 
    // Do the math
    cout << "4 + 2 = " << p.add(4, 2) << endl;
    cout << "4 - 2 = " << p.sub(4, 2) << endl;
    cout << "4 * 2 = " << p.mul(4, 2) << endl;
    cout << "4 / 2 = " << p.div(4, 2) << endl;
 
    return 0;
}

C#

  class MainApp
  {
    static void Main()
    {
      // Create math proxy
      MathProxy p = new MathProxy();
 
      // Do the math
      Console.WriteLine("4 + 2 = " + p.Add(4, 2));
      Console.WriteLine("4 - 2 = " + p.Sub(4, 2));
      Console.WriteLine("4 * 2 = " + p.Mul(4, 2));
      Console.WriteLine("4 / 2 = " + p.Div(4, 2));
 
      // Wait for user
      Console.Read();
    }
  }
 
  // "Subject"
 
  public interface IMath
  {
    double Add(double x, double y);
    double Sub(double x, double y);
    double Mul(double x, double y);
    double Div(double x, double y);
  }
 
   // "RealSubject"
 
  class Math : IMath
  {
    public double Add(double x, double y){return x + y;}
    public double Sub(double x, double y){return x - y;}
    public double Mul(double x, double y){return x * y;}
    public double Div(double x, double y){return x / y;}
  }
 
  // "Proxy Object"
 
  class MathProxy : IMath
  {
    Math math;
 
    public MathProxy()
    {
      math = new Math();
    }
 
    public double Add(double x, double y)
    {
      return math.Add(x,y);
    }
 
    public double Sub(double x, double y)
    {
      return math.Sub(x,y);
    }
 
    public double Mul(double x, double y)
    {
      return math.Mul(x,y);
    }
 
    public double Div(double x, double y)
    {
      return math.Div(x,y);
    }
  }

/* Subject */
function IMath() {
	this.add = function(x, y) {};
	this.sub = function(x, y) {};
}
 
/* Real Subject */
function RMath() {
	/*
	IMath.call(this); // агрегируем IMath, т.к. нативного наследования нет
	// этот вариант следует использовать вместо прототипирования, 
	// если в IMath имеются приватные переменные, 
	// которые могут быть доступны через геттеры в IMath
	*/
	this.add = function(x, y) {
		return x + y;
	};
	this.sub = function(x, y) {
		return x - y;
	};
}
RMath.prototype = new IMath();
RMath.prototype.constructor = RMath;
 
/* Proxy */
function MathProxy() {
	var math = new RMath();
 
	this.add = function(x, y) {
		return math.add(x, y);
	};
	this.sub = function(x, y) {
		return math.sub(x, y);
	};
}
 
var test = new MathProxy();
alert(test.add(3, 2)); // 5
alert(test.sub(3, 2)); // 1

Object Pascal

См. также

Литература


структурные шаблоны проектирования
[править]

адаптер | мост | компоновщик | декоратор | фасад | заместитель | приспособленец


Wikimedia Foundation. 2010.

Игры ⚽ Поможем решить контрольную работу
Синонимы:
, , , , , , , , , , , , , , , , , , , , , , , , , , ,


Полезное


Смотреть что такое "Заместитель" в других словарях:

  • заместитель — См. преемник... Словарь русских синонимов и сходных по смыслу выражений. под. ред. Н. Абрамова, М.: Русские словари, 1999. заместитель наследник, преемник, помощник; замена, замдекана, замдиректора, зампред, товарищ, зам, замзав, замглавы,… …   Словарь синонимов

  • ЗАМЕСТИТЕЛЬ — ЗАМЕСТИТЕЛЬ, заместителя, муж. 1. Лицо, замещающее кого нибудь. Если хотите уйти со службы, приищите себе заместителя. 2. Официальное название должности помощника начальника какого нибудь учреждения (офиц.). Заместитель директора. Заместитель… …   Толковый словарь Ушакова

  • ЗАМЕСТИТЕЛЬ — ЗАМЕСТИТЕЛЬ, я, муж. 1. Человек, к рый заменяет кого н. в какой н. должности. Найти себе заместителя. 2. Помощник вышестоящего должностного лица. З. директора. | жен. заместительница, ы. | прил. заместительский, ая, ое. Толковый словарь Ожегова.… …   Толковый словарь Ожегова

  • Заместитель — 1. Тот, кто выполняет чьи л. обязанности, заменяет кого л. в какой л. должности. 2. Что л. замещающее, заменяющее что л. 3. Должность помощника вышестоящего должностного лица (директора, главного инженера и т.п.); тот, кто исполняет такую… …   Словарь бизнес-терминов

  • заместитель — душевный импульс, направленный из бессознательного в сознание и являющий собой новую форму старой вытесненной идеи, связанной с несовместимым желанием. Словарь практического психолога. М.: АСТ, Харвест. С. Ю. Головин. 1998 …   Большая психологическая энциклопедия

  • заместитель — — [А.С.Гольдберг. Англо русский энергетический словарь. 2006 г.] Тематики энергетика в целом EN deputy …   Справочник технического переводчика

  • заместитель — сущ., м., употр. сравн. часто Морфология: (нет) кого? заместителя, кому? заместителю, (вижу) кого? заместитель, кем? заместителем, о ком? о заместителе; мн. кто? заместители, (нет) кого? заместителей, кому? заместителям, (вижу) кого? заместителей …   Толковый словарь Дмитриева

  • ЗАМЕСТИТЕЛЬ — (surrogate) 1. В психологии человек или предмет в чьей то жизни, являющийся заменителем кого либо или чеголибо. При лечении различных сексуальных нарушений, когда пациент не имеет партнера, который мог бы помочь ему в лечении, прикрепляемый к… …   Толковый словарь по медицине

  • заместитель —   , я, м.   Помощник вышестоящею должностного лица.   * 3аместитель директора по политработе (по политчасти).   ◘ Начальник политотдела МТС одновременно является заместителем директора МТС по политработе. КПСС в рез., т. 3, 196. Работники… …   Толковый словарь языка Совдепии

  • заместитель — pakaitas statusas T sritis Standartizacija ir metrologija apibrėžtis Atomas ar sujungtų atomų grupė, pakeitę molekulėje vandenilio atomą. atitikmenys: angl. substituent vok. Substituent, m rus. заместитель, m; замещающая группа, f; замещающий… …   Penkiakalbis aiškinamasis metrologijos terminų žodynas


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»