Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПИАПС / knigaVAPO_v2.doc
Скачиваний:
366
Добавлен:
17.04.2018
Размер:
35.96 Mб
Скачать

V.Visit(this);

}

 

 /*virtual*/void That::accept(Visitor &v)

{

V.Visit(this);

}

 

 /*virtual*/void TheOther::accept(Visitor &v)

{

V.Visit(this);

}

 

// 3. Создайте производные классы Visitor для каждой

// "операции", исполняемой над "элементами"

class UpVisitor: public Visitor

{

     /*virtual*/void visit(This *e)

    {

        cout << "do Up on " + e->thiss() << '\n';

    }

     /*virtual*/void visit(That *e)

    {

        cout << "do Up on " + e->that() << '\n';

    }

     /*virtual*/void visit(TheOther *e)

    {

        cout << "do Up on " + e->theOther() << '\n';

    }

};

 

class DownVisitor: public Visitor

{

     /*virtual*/void visit(This *e)

    {

        cout << "do Down on " + e->thiss() << '\n';

    }

     /*virtual*/void visit(That *e)

    {

        cout << "do Down on " + e->that() << '\n';

    }

     /*virtual*/void visit(TheOther *e)

    {

        cout << "do Down on " + e->theOther() << '\n';

    }

};

 

Int main()

{

  Element *list[] =

  {

    new This(), new That(), new TheOther()

  };

 

  UpVisitor up;      // 4. Клиент создает

  DownVisitor down;  //    объекты Visitor

  for (int i = 0; i < 3; i++)

    // и передает каждый

    list[i]->accept(up);   

  for (i = 0; i < 3; i++)

    // в вызываемый метод accept()

    list[i]->accept(down);

}

Вывод программы:

do Up on This do Down on This do Up on That

do Down on That do Up on TheOther do Down on TheOther

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

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

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

5.6.12. Обсуждение паттернов поведения

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

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

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

Соседние файлы в папке ПИАПС