Шаблон дизайна шаблона посетителя

задняя часть Шаблоны проектирования

Поведенческая модель.

Определение режима посетителя

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

При разработке программного обеспечения иногда необходимо иметь дело с заданной структурой объекта, такой как предписание, в котором хранится ряд различных типов информации об объекте, а методы работы с элементами одной и той же структуры объекта не уникальны.
Может потребоваться несколько различных методов обработки.

Структура шаблона посетителя

Структура схемы посетителя содержит следующие 5 ролей:

  • Посетитель (абстрактный посетитель): абстрактный посетитель объявляет операцию посещения для каждого класса конкретного элемента ConcreteElement в структуре объекта.Из имени или типа параметра этой операции можно четко определить тип посещаемого конкретного элемента, а также конкретный посетитель должен реализовать. Эти методы работы определяют операции доступа к этим элементам.
  • Конкретика (специально посетитель): посетитель достигает определенных деклараций абстрактных методов посетителей, каждый из операционного элемента для осуществления типа доступа к структуре объекта.
  • Элемент: обычно абстрактный класс или интерфейс определяет метод Accept, который обычно является параметром абстрактного посетителя.
  • ConcreteElement (бетонный элемент): конкретный элемент реализует метод Accept, а метод доступа посетителя вызывается в методе Accept для завершения операции элемента.
  • ObjectStructure: структура объекта представляет собой набор элементов, который содержит объекты элементов и предоставляет методы для облегчения элементов внутри него.

design-visitor

шаблон посетителя

Реализация шаблона посетителя

Как роль структуры объекта, автомобиль содержит некоторые объекты, такие как двигатель и кузов.Объект роли посетителя - PrintVisitor.Автомобиль принимает посетителя, чтобы позволить ему получить доступ к различным компонентам автомобиля и распечатать информацию;

visitor

public interface Visitor {
    void visit(Engine engine);
    void visit(Body body);
    void visit(Car car);
}

Интерфейс посетителей содержит три метода

конкретный посетитель

Посетители автопечати:

public class PrintCar implements Visitor {
    public void visit(Engine engine) {
        System.out.println("Visiting engine");
    }
    public void visit(Body body) {
        System.out.println("Visiting body");
    }
    public void visit(Car car) {
        System.out.println("Visiting car");
    }
}

Посетители Автосервиса:

public class CheckCar implements Visitor {
    public void visit(Engine engine) {
        System.out.println("Check engine");
    }
    public void visit(Body body) {
        System.out.println("Check body");
    }
    public void visit(Car car) {
        System.out.println("Check car");
    }
}

абстрактный элемент

public interface Visitable {
    void accept(Visitor visitor);
}

определенные элементы

public class Body implements Visitable {
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
}
public class Engine implements Visitable {
    @Override    
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
}

структура объекта

public class Car {
    private List<Visitable> visit = new ArrayList<>();
    public void addVisit(Visitable visitable) {
        visit.add(visitable);
    }
    public void show(Visitor visitor) {
        for (Visitable visitable: visit) {
            visitable.accept(visitor);
        }
    }
}

Структура объекта в текущем примере шаблона посетителя, этот список представляет собой набор элементов (Visitable), который является обычным представлением структуры объекта, обычно это набор из набора элементов, но этот набор не обязательно является списком , это может быть Дерево,
Любая структура данных, такая как связанный список или даже несколько структур данных. Метод show является сущностью класса car, он будет перечислять каждый элемент для посещения посетителями.

клиент

public class Client {
    static public void main(String[] args) {
        Car car = new Car();
        car.addVisit(new Body());
        car.addVisit(new Engine());
        
        Visitor print = new PrintCar();
        car.show(print);
    }
}

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

Суммировать

Эта статья в основном знакомит с шаблоном посетителя, ссылаясь на пример Википедии, автор дает реализацию. Из приведенного выше объяснения шаблон посетителя подходит для относительно стабильной структуры объекта, но часто необходимо определить новые операции над этой структурой объекта.
Вам нужно выполнять много разных и несвязанных операций над объектами в структуре объекта, и вам нужно избегать того, чтобы эти операции «загрязняли» классы этих объектов, и вы не хотите изменять эти классы по мере добавления новых операций.

преимущество:

  • Очень удобно добавлять новые операции доступа, по принципу открытия и закрытия;
  • Поведение доступа к объекту элемента централизовано в объекте посетителя, а не разбросано по каждому классу элемента, обязанности класса более ясны в соответствии с принципом единой ответственности.

Основные недостатки:

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

Ссылаться на

  1. wikipedia
  2. Путешествие шаблонов проектирования — 16. Шаблон посетителя