?

Log in

 
 
26 January 2007 @ 03:27 pm
Visitor для wrapper 'а  

Предположим у нас есть класс handler с методом doit() и doit2() и два класса обертки, которые подсчитывают количество вызовов методов doit и doit2 соответственно.

Задача простая: как собрать статистику вызовов со всех объектов не правя существующих классов?. Правильно - паттерн Visitor. Однако этот паттерн требует, чтобы все посещаемые классы имели соотвествующий интерфейс посещения. Мы сделаем проще - сделаем класс обертку:

Теперь разработаем класс visitor

В принципе в методе visit можно было и делать всю обработку, однако мы вынесли логику из класса, чтобы его можно было использовать повторно. Итак, создаем класс подсчитывающий вызовы метода doit и doit2

Проблема в том, что класс doit_statistics требует от посещаемого оъекта наличие двух методов: get_doit_count() и get_doit_count2(). Так что же, теперь надо делать визиторы для всех трех, вариантов. Мы сделаем круче:

Теперь мы можем посещать любые visitable объекты не заботясь о наличии у них необходимого интерфейса. Но мы на этом не остановимся. Создадим список посещения, чтобы один раз заполнить его, а затем по необходимость, повторить сбор статистики.

Ограничение visit_list в том, что он может работать только с одним типом посещаемых объектов. Исправим это досадное недоразумение с помощью списка типов и специализацией класса visit_list:

Уф... Теперь полный пример. Шаблон посетитель реализован в migashko::patterns:

К чему я все это? А ктому, что шаблон visitor используется в migashko::inet, для сбора статистики по подключениям и переданных/прочитанных данных. Кто догадаеться, что будет выведено на экран, тот может считать себя крутым программистом)))

 
 
Current Location: На работе
Current Music: куллер