Шаблон делегирования - Delegation pattern

В программная инженерия, то схема делегирования является объектно-ориентированный шаблон дизайна это позволяет состав объекта добиться того же повторное использование кода в качестве наследование.

В составе делегации объект обрабатывает запрос, делегируя его второму объекту ( делегировать). Делегат вспомогательный объект, но с исходным контекстом. При поддержке делегирования на уровне языка это делается неявно, если себя в делегате относятся к исходному (отправляющему) объекту, а не к делегату (принимающему объекту). В шаблоне делегата это вместо этого достигается путем явной передачи исходного объекта делегату в качестве аргумента метода.[1] Обратите внимание, что «делегирование» часто используется в широком смысле для обозначения отдельной концепции пересылка, где отправляющий объект просто использует соответствующий член на принимающем объекте, оцениваемый в контексте получение объект, а не исходный объект.

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

Определение

Во введении к Gamma et al. 1994 Грэди Буч определил делегацию как:

Делегация это способ сделать композицию такой же мощной для повторного использования, как и наследование [Lie86, JZ91]. В составе делегации два объекты участвуют в обработке запроса: объект-получатель делегирует операции своему делегировать. Это аналогично тому, как подклассы откладывают запросы к родительским классам. Но с наследованием унаследованная операция всегда может ссылаться на получающий объект через это переменная-член в C ++ и себя в Smalltalk. Чтобы добиться того же эффекта с делегированием, получатель передает себя делегату, чтобы делегированная операция ссылалась на получателя.[2]

Пример

В примере ниже (используя Котлин язык программирования), учебный класс Окно делегаты то площадь() вызов его внутреннего объекта Rectangle (его делегата).

учебный класс Прямоугольник(вал ширина: Int, вал высота: Int) {    весело площадь() = ширина * высота}учебный класс Окно(вал границы: Прямоугольник) {    // Делегирование    весело площадь() = границы.площадь()}

Языковая поддержка

Некоторые языки имеют встроенную поддержку делегирования.[3] Например, в Котлин язык программирования, мы могли бы написать:

интерфейс ClosedShape {    весело площадь(): Int}учебный класс Прямоугольник(вал ширина: Int, вал высота: Int) : ClosedShape {    отменять весело площадь() = ширина * высота}учебный класс Окно(частный вал границы: ClosedShape) : ClosedShape к границы

Смотрите также

Рекомендации

  1. ^ Gamma et al. 1994 г.
  2. ^ Гамма, Эрих; Хелм, Ричард; Джонсон, Ральф; Влиссидес, Джон (1995). Паттерны проектирования: элементы объектно-ориентированного программного обеспечения многократного использования (14. печатн. Ред.). Ридинг, Массачусетс: Эддисон-Уэсли. п.20. ISBN  0-201-63361-2.
  3. ^ «Делегация - язык программирования Котлин». Котлин. Получено 2019-03-23.

внешняя ссылка