Модел за дизайн на посетители

Предназначение на модела Visitor

  • Моделът Visitor дефинира операцията, извършена върху всеки елемент от някаква структура. Позволява, без да променя класовете на тези обекти, да добавя нови операции към тях.
  • Е класическа техника за възстановяване на информация за изгубен тип.
  • Моделът Visitor ви позволява да извършвате желаните действия в зависимост от видовете два обекта.
  • Осигурява двоен диспечерски механизъм.

Проблемът, който трябва да бъде решен

Трябва да се извършват различни и несвързани операции върху възлови обекти с някаква хетерогенна агрегирана структура. Искате да избегнете „замърсяването“ на класовете на тези възли с такива операции (т.е. избягване на добавянето на подходящи методи към тези класове). И не искате да правите заявки за типа на всеки възел и да прехвърляте указателя към правилния тип, преди да извършите желаната операция.

Дискусия на модела на посетителя

Основната цел на шаблона Visitor е да въведе абстрактна функционалност за цялостната йерархична структура на обектите "елемент", а именно шаблонът Visitor позволява, без промяна на класовете Element, да добавя нови операции към тях. За целта цялата функционалност на обработката се прехвърля от самите класове на Element (тези класове стават „леки“) в йерархията на наследяване на посетителите .

В същото време шаблонът Visitor използва техниката "двойно изпращане". Обикновено заявките се предават с помощта на „единично изпращане“ - коя операция се извършва за обработка на заявката, зависи от името на заявката и вида на получателя. При „двойно изпращане“ извиканата операция зависи от името на заявката и типовете на двамата получатели (тип Visitor и тип елемент, който се посещава).

Внедрете шаблона за посетители, както следва. Създайте йерархия от класове Visitor с чист метод за виртуално посещение (), дефиниран в абстрактния базов клас за всеки подклас Element на агрегатната структура. Всеки метод visit () взема един аргумент - указател или препратка към подкласа Element .

Всяка нова добавена операция се моделира с помощта на специфичен подклас Visitor. Подкласовете на посетителите изпълняват методите visit (), декларирани в основния клас Visitor .

Добавете един чисто виртуален метод accept () към базовия клас на йерархията на Element. Accept () приема един параметър като параметър - указател или препратка към абстрактния базов клас на йерархията на посетителите .

Вече са готови „артикулите“ и „посетителите“. Ако клиентът трябва да извърши някаква операция, той създава екземпляр на обект на съответния подклас Visitor и извиква метода accept () за всеки обект на Element, като предава екземпляра Visitor като параметър.