Студопедия
Главная страница | Контакты | Случайная страница

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Паттерны поведения

Читайте также:
  1. F68 Другие расстройства зрелой личности и поведения у взрослых
  2. IV. ОТУЧЕНИЕ: КАК ИСПОЛЬЗОВАТЬ ПОДКРЕПЛЕНИЕ, ЧТОБЫ ИЗБАВИТЬСЯ ОТ НЕЖЕЛАТЕЛЬНОГО ПОВЕДЕНИЯ
  3. Анализ поведения объекта
  4. Анализ рынка —это изучение спроса и предложения в определенной товарной категории, исследование потребительского поведения, структуры и конъюнктуры рынка.
  5. Введение в паттерны проектирования
  6. Введение в паттерны проектирования
  7. Введение в паттерны проектирования
  8. Введение в паттерны проектирования
  9. Введение в паттерны проектирования
  10. Введение в паттерны проектирования

InventoryVisitor к структуре объектов можно применить следующим об­разом:

Equipment* component; InventoryVisitor visitor;

component->Accept(visitor); cout «"Инвентарная опись "

«component->Name()

«visitor.Getlnventory();

Далее мы покажем, как на языке Smalltalk реализовать пример из описания паттерна интерпретатор с помощью паттерна посетитель. Как и в предыдущем случае, этот пример настолько мал, что паттерн посетитель практически беспо­лезен, но служит неплохой иллюстрацией основных принципов. Кроме того, де­монстрируется ситуация, в которой обход выполняет посетитель.

Структура объектов (регулярные выражения) представлена четырьмя класса­ми, в каждом из которых существует метод accept:, принимающий посетитель в качестве аргумента. В классе SequenceExpression метод accept: выглядит так:

accept: aVisitor

л aVisitor visitSequence: self

Метод accept: в классах RepeatExpression, AlternationExpression и LiteralExpression посылает сообщения visitRepeat:, visitAlternation: и visitLiteral: соответственно.

Все четыре класса должны иметь функции доступа, к которым может обратить­ся посетитель. Для SequenceExpression это expression! иехргезз!оп2;для AlternationExpression- alternative! и alternative2; для класса RepeatExpression -repetition,а дляLiteralExpression -components.

Конкретным посетителем выступает класс REMatchingVisitor. Он отвеча­ет за обход структуры, поскольку алгоритм обхода нерегулярен. В основном это происходит из-за того, что RepeatExpression посещает свой компонент много­кратно. В классе REMatching Visitor есть переменная экземпляра inputstate. Его методы практически повторяют методы match: классов выражений из пат­терна интерпретатор, только вместо аргумента inputstate подставляется узел, описывающий сравниваемое выражение. Однако они по-прежнему возвращают множество потоков, с которыми выражение должно сопоставиться, чтобы полу­чить текущее состояние:

visitSequence: sequenceExp

inputstate:= sequenceExp expressionl accept: self. A sequenceExp expression2 accept: self.

visitRepeat: repeatExp I finalState I

finalState:= inputstate copy, [inputstate isEmpty]


 

Паттерн Visitor

whileFalse:

[inputState:= repeatExp repetition accept: self. finalState addAll: inputState]. A finalState

VisitAlternation: alternateExp I finalState originalState I originalState:= inputState.

finalState:= alternateExp alternativel accept: self. inputState:= originalState.

finalState addAll: (alternateExp alternative2 accept: self). A finalState

visitLiteral: literalExp I finalState tStream I finalState:= Set new. inputState do:

[:stream I tStream:= stream copy. (tStream nextAvailable:

literalExp components size) = literalExp components

ifTrue: [finalState add: tStream]

]. A finalState

Известные применения

В компиляторе Smalltalk-80 имеется класс посетителя, который называется ProgramNodeEnumerator. В основном он применяется в алгоритмах анализа ис­ходного текста программы и не используется ни для генерации кода, ни для кра­сивой печати, хотя мог бы.

IRIS Inventor [Str93] - это библиотека для разработки приложений трехмер­ной графики. Библиотека представляет собой трехмерную сцену в виде иерархии узлов, каждый из которых соответствует либо геометрическому объекту, либо его атрибуту. Для операций типа изображения сцены или обработки события ввода необходимо по-разному обходить эту иерархию. В Inventor для этого служат по­сетители, которые называются действиями (actions). Есть различные посетители для изображения, обработки событий, поиска, сохранения и определения ограни­чивающих прямоугольников.

Чтобы упростить добавление новых узлов, в библиотеке Inventor реализо­вана схема двойной диспетчеризации на C++. Для этого служит информация о типе, доступная во время выполнения, и двумерная таблица, строки которой представ­ляют посетителей, а колонки - классы узлов. В каждой ячейке хранится указатель на функцию, связанную с парой посетитель-класс узла.

Марк Линтон (Mark Linton) ввел термин «посетитель» (Visitor) в специфика­цию библиотеки для построения приложений X Consortium's Fresco Application Toolkit [LP93].


 

Паттерны поведения

Родственные паттерны

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

Интерпретатор: посетитель может использоваться для выполнения интер­претации.




Дата добавления: 2015-09-11; просмотров: 91 | Поможем написать вашу работу | Нарушение авторских прав

Паттерн State | Паттерн State | Паттерн Strategy | Применимость | Результаты | AStrategy theStrategy; | Паттерн Strategy | Паттерны поведения | Реализация | Паттерн Visitor |


lektsii.net - Лекции.Нет - 2014-2025 год. (0.336 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав