Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Visitor

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

Этот шаблон может использоваться например в следующей ситуации. Допустим ConcreteElementA и ConcreteElementB представлены классами типа Circle и Square. Необходимо вычислять их площать. При этом есть потребность вынести операцию вычисления площади за пределы класса. (Например, при наличии нескольких операций которые можно добавлять или удалять динамически.) Оба класса экспортируют свойства, первый – радиус, сторой – размер стороны. Пусть за операцию вычисления площади отвечает ConcreteVisitorA, тогда его код быть иметь вид:

 

public class AreaVisitor implements Visitor{

 

private float totalArea = 0;

 

public void visit(Element element){

if(element instanceof Square){

Square square = (Square)element;

totalArea += square.side()*square.side();

}else if(element instanceof Circle){

Circle circle = (Circle)element;

totalArea += 3.14 * circle.radius()*circle.raduis();

}else{

System.out.println(“Unknown Element, ignoring it”);

}

}

}

 

 

При этом видно, что класс AreaVisitor зависит от классов с которыми он может работать (так как напрямую приводит к их типу). Вообще говоря приведение интерфейса к типу является нежелательным подходом при проектировании, однако, такой трибуты позволяет выделить и добавлять операции к элементам не меняя их кода. Например, не меняя кода можно добавить операцию отрисовки на экране заданной коллекции элементов. Если состав типов элементов фиксирован (например, нам известно, что в нашей модели могут быть только Circle и Square), то можно использовать перегрузку методов, вместо явного приведения и неудобных операций if(...){...}else.

 

 

<== предыдущая лекция | следующая лекция ==>
Template Method | Adapter
Поделиться с друзьями:


Дата добавления: 2014-01-05; Просмотров: 289; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.008 сек.