Язык программирования Java Дмитриев Андрей Владиславович 2007
Посетитель Представляет операцию, которую надо выполнить над элементами объекта. Позволяет определить новую операцию, не меняя классы элементов, к которым он применяется. Применяется: при необходимости обработать одинаковые данные, находящиеся в объектах с разными интерфейсами; при расширении существующей библиотеки (при невозможности ее редактировать).
Посетитель Каждый из доступных классов реализует метод public void accept(Visitor v){ v.visit(this); }
Посетитель (cont.) public class Employee { private int vacDays; private String name; public void accept(Visitor v) { v.visit(this); } public Employee(String name, int vd) { vacDays = sd; this.name = name; }
Посетитель (cont.) public abstract class Visitor { public abstract void visit(Employee emp); public abstract void visit(Boss emp); }
Посетитель (cont.) public class VacationVisitor extends Visitor { protected int total_days; public VacationVisitor() { total_days = 0; } public void visit(Employee emp) { total_days += emp.getVacDays(); } public void visit(Boss boss) { total_days += boss.getVacDays(); }
Посетитель (cont.) VacationVisitor vac = new VacationVisitor(); for (int i = 0; i < employees.length; i++) { employees[i].accept(vac); } System.out.println(vac.getTotalDays());
Посетитель (cont.) public class Boss extends Employee { private int bonusDays; public Boss(String name, int vacdays) { super(name,vacdays); } public void accept(Visitor v) { v.visit(this); }
Посетитель (cont.) public class VacationVisitor extends Visitor { protected int total_days; public VacationVisitor() { total_days = 0; } public void visit(Employee emp) { total_days += emp.getVacDays(); } public void visit(Boss boss) { total_days += boss.getVacDays(); total_days += boss.getBonusDays(); }
Посетитель (cont.) public void visit (Employee emp) { total_days += emp.getVacDays(); // проверка сущности if(emp instanceof Manager) { total_days += ((Manager)emp).getBonusDays (); }
Посетитель (Выводы)
Правда ли что… Класс-заместитель может не иметь корректной ссылки на целевой класс? Класс-одиночка не может иметь публичного конструктора? Паттерн Посетитель делает обратные вызовы к классу-посетителю?