Режим посетителя: инкапсулируйте некоторые операции, которые действуют на каждом элементе в определенную структуру данных. Он может определить новые операции, которые действуют на эти элементы, не изменяя эту структуру данных. Структурная схема режима посетителя выглядит следующим образом:
На рисунке выше вы можете видеть, что у него есть следующие персонажи:
Роль абстрактного посетителя: определяет интерфейс и объявляет одну или несколько операций доступа.
Роль конкретного посетителя: реализует интерфейс, объявленный абстрактными посетителями, то есть различными операциями доступа, объявленными абстрактными посетителями.
Абстрактный элемент (посещаемый) Роль: объявляет операцию принятия, принимая объект для посетителя в качестве параметра.
Роль конкрета: реализует операцию принятия, указанную абстрактными узлами.
Роль объекта Data Structure (ObjectStructure): он может пройти все элементы в структуре и обеспечить интерфейс для объекта для посетителя для доступа к каждому элементу.
Код моделирования выглядит следующим образом:
Интерфейс -посетитель {void визит (Gladiolus G); пустое посещение (хризантема C); } // Бетонное имя посетителя имен посетитель Доступ к классу StringVisitor реализует посетителя {String S; public String toString () {return s; } public void визит (Gladiolus g) {s = "Gladiolus"; } public void визит (chrysanteumum c) {s = "chrysanteumum"; }} // бетонный класс посетителей Beevisitor реализует посетителя {public void visit (gladiolus g) {System.out.println («Bee для доступа к Gladiolus»); } public void визит (chrysanteum c) {System.out.println ("bee для доступа к chrysanteum"); }} Интерфейс Flower {void Accept (посетитель V); } / * * Бетонный элемент chrysanthemum реализует цветок {public void accept (посетитель v) {v.visit (this); }} // Concrete Element Class Gladiolus реализует Flower {public void Accept (посетители V) {v.visit (this); }} // Это генератор цветочных объектов класса FlowerGenerator {Private Static Random Rand = new Random (); public Static Flower newflower () {switch (rand.nextint (2)) {по умолчанию: case 0: return new Gldiolus (); Случай 1: вернуть новый Chrysanthemum (); }}} Общедоступный тест класса { / * * Во -первых, получите конкретную роль посетителя на клиенте. Структура объекта пересекается. Вызовите метод принятия для каждого элемента и передайте конкретную роль посетителя. для (int i = 0; i <10; i ++) цветы. Add (flowergenerator.newflower ()); Посетитель посетителя = new Stringvisitor (); Итератор <цветок> итератор = цветы. while (iterator.hasnext ()) {iterator.next (). Принять (посетитель); System.out.println (посетитель); } System.out.println ("-----------------------"); /** Новое поведение доступа: Beevisitor Bee Access*/ Visitor Visitor2 = new Beevisitor (); для (цветок: цветы) {цветок.accept (посетитель2); }}}результат:
Гладиолус Хризантема Кризантема Глдиоолус Хризантема Кризантема Кризантема Кризантем Глдиолус Гладиолус ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Режим посетителя можно рассмотреть, если:
1. Структура объекта содержит много объектов класса, и они имеют разные интерфейсы, и вы хотите реализовать некоторые операции, которые зависят от их конкретных классов на этих объектах.
2. Вам необходимо выполнить много разных и неуместных операций на объектах в структуре объекта, и вы хотите избежать того, чтобы эти операции «загрязняли» классы этих объектов. Посетитель позволяет вам концентрировать связанные операции и определять их в классе.
3. Когда структура объекта используется многими приложениями, используйте режим посетителя, чтобы каждое приложение содержало только те операции, которые необходимо использовать.
4. Классы, которые определяют структуру объекта, редко меняются, но для определения этой структуры часто необходимы новые операции. Изменение класса структуры объектов требует переопределения интерфейса для всех посетителей, что может быть большой стоимостью. Если класс структуры объекта часто изменяется, может быть лучше определить эти операции в этих классах.
Эти люди, по -видимому, являются предложениями, и в проекте необходимо проанализировать конкретные проблемы.