Посетитель
Visitor
Тип поведенческий
Назначение не изменяя основного класса, добавить в него новые операции.
Структура
Применяется в случаях когда необходимо для ряда классов сделать похожую (одну и ту же) операцию.
Плюсы
  • новая функциональность в несколько классов добавляется сразу, не изменяя код этих классов;
  • позволяет получить информацию о типе объекта;
  • двойная диспетчеризация;
  • возможность описания своего алгоритма для каждого типа объектов.
Минусы
  • при изменении обслуживаемого класса нужно поменять код у шаблона;
  • затруднено добавление новых классов, поскольку нужно обновлять иерархию посетителя и его сыновей.
Описан в Design Patterns Да

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

Шаблон демонстрирует классический приём восстановления информации о потерянных типах, не прибегая к понижающему приведению типов при помощи двойной диспетчеризации.

Решаемая проблема

править

Необходимо сделать какие-то несвязные операции над рядом объектов, но нужно избежать загрязнения их кода. И нет возможности или желания запрашивать тип каждого узла и осуществлять приведение указателя к правильному типу, прежде чем выполнить нужную операцию.

Задача

править

Над каждым объектом некоторой структуры выполняется одна или более операций. Нужно определить новую операцию, не изменяя классы объектов.

Решение

править

Для независимости посетитель имеет отдельную иерархию. Структуры имеют некий интерфейс взаимодействия.

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

править

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

Создается базовый класс Visitor с методами visit() для каждого подкласса родительского Element. Добавьте метод accept(visitor) в иерархию Element. Для каждой операции, которая должна выполняться для объектов Element, создайте производный от Visitor класс. Реализации метода visit() должны использовать открытый интерфейс класса Element. В результате: клиенты создают объекты Visitor и передают их каждому объекту Element, вызывая accept().

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

править

Шаблон следует использовать, если:

  • имеются различные объекты разных классов с разными интерфейсами, но над ними нужно совершать операции, зависящие от конкретных классов;
  • необходимо над структурой выполнить различные, усложняющие структуру операции;
  • часто добавляются новые операции над структурой.

Преимущества и недостатки

править

Преимущества:

  • упрощается добавление новых операций;
  • объединение родственных операции в классе Visitor;
  • класс Visitor может запоминать в себе какое-то состояние по мере обхода контейнера.

Недостатки:

  • затруднено добавление новых классов, поскольку нужно обновлять иерархию посетителя и его сыновей.

Реализация

править
  1. Добавьте метод accept(Visitor) в иерархию «элемент».
  2. Создайте базовый класс Visitor и определите методы visit() для каждого типа элемента.
  3. Создайте производные классы Visitor для каждой операции, исполняемой над элементами.
  4. Клиент создаёт объект Visitor и передаёт его в вызываемый метод accept().

C++

править

Java

править

Kotlin

править

C#

править

PHP

править

Python

править

Delphi

править

Swift

править

Литература

править
  • Э. Гамма, Р. Хелм, Р. Джонсон, Дж. Влиссидес. Приемы объектно-ориентированного проектирования. Паттерны проектирования. — СПб.: Питер, 2001. — 368 с. — ISBN 5-272-00355-1.

Ссылки

править

📚 Artikel Terkait di Wikipedia

Дерево квадрантов

center; XY halfDimension; function __construct(XY center, XY halfDimension) {...} function containsPoint(XY p) {...} function intersectsAABB(AABB other)

Внедрение зависимости

$password; } public function getHost() { return $this->host; } public function getPort() { return $this->port; } public function getUsername() { return

Конструктор (объектно-ориентированное программирование)

прикреплянного к my_point_2, другими значениями. my_point_1: POINT my_point_2: POINT ... create my_point_1 create my_point_2.make (3.0, 4.0) my_point_2.make (5

Алгоритм Рамера — Дугласа — Пекера

else ResultList[] = {PointList[1], PointList[end]} end // Возвращаем результат return ResultList[] end function DouglasPeucker(PointList[], epsilon) { //

Приспособленец (шаблон проектирования)

$this->descent = 0; } public function Display($pointSize) { $this->pointSize = $pointSize; print ($this->symbol." (pointsize ".$this->pointSize.")"); } } // "ConcreteFlyweight"

Оценка затрат на разработку программного обеспечения

ISBN 0735605351. M. A. Parthasarathy. Practical Software Estimation: Function Point Methods for Insourced and Outsourced Projects (англ.). — Pearson Education

Консорциум по качеству программного обеспечения

сентября 2012). Архивировано 11 ноября 2014 года. OMG Adopts Automated Function Point Specification . OMG. Дата обращения: 13 августа 2016. Архивировано 25

Функция рассеяния точки

Функция рассеяния точки (англ. point spread function, PSF) описывает картину, получаемую системой формирования изображения при наблюдении точечного источника