Инструменты пользователя

Инструменты сайта


pattern_visiter

Назад

Паттерн Посетитель используется для расширения возможностей комбинации объектов в том случае, если инкапсуляция не существенна.

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

Управляет объектом-посетителем специальный объект-клиент(Traverser), в нем-то и сосредоточена вся функциональность. При добавлении новой функциональности изменения вносятся только в посетителе, а объекты составной структуры не изменяются, тем самым соблюдая принцип «Открытости/закрытости».

Преимущества посетителя:

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

К недостаткам относится:

  • Нарушение инкапсуляции составной структуры и усложнение ее возможной модернизации.

Traverser
class Traverser
{
    Shop shop;
    Visiter visiter;
    public Traverser(Shop shop)
    {
        this.shop = shop;
        visiter = new Visiter();
    }
 
    public void displayStat()
    {
        for(Item item : shop.getItems())
        {
            System.out.println(visiter.getInfo(item)); 
        }
    }
 
}
class Visiter
{
    public String getInfo(Item item)
    {
        return item.getInfo();
    }
}
Item
class Item
{
 
    private String name;
    private double price;
 
    Item(String name, double price)
    {
        this.name = name;
        this.price = price;
    }
 
    public String getInfo()
    {
        return name + " - " + price + "$";
    }
}
Shoh
class Shop
{
    private ArrayList<Item> items;
 
    public Shop()
    {
        items = new ArrayList<Item>();
    }
 
    public void addItem(Item item)
    {
       items.add(item);
    }
 
    public ArrayList<Item> getItems()
    {
        return items;
    }
}
Main
import java.util.ArrayList;
 
public class Main
{
 
    public static void main(String[] args)
    {
        Shop shop = new Shop();
 
        shop.addItem(new Item("Monitor", 5500));
        shop.addItem(new Item("Keyboard", 250));
        shop.addItem(new Item("Mouse", 250));
        shop.addItem(new Item("Computer", 10000));
 
        Traverser manager = new Traverser(shop);
        manager.displayStat();
    }
}
Monitor - 5500.0$
Keyboard - 250.0$
Mouse - 250.0$
Computer - 10000.0$

Пример 2

Traverser
class Traverser
{
 
    ArrayList<GenericElement> elements;
 
    Traverser()
    {
        elements = new ArrayList<GenericElement>();
        elements.add(new IntElement(10));
        elements.add(new StringElement("Hello!"));
    }
 
    void visit()
    {
        Visitor visitor = new Visitor();
        for (GenericElement element : elements)
        {
            element.accept(visitor);
        }
    }
}
Visitor
class Visitor
{
 
    void visit(IntElement element)
    {
        System.out.println("int: " + element.value);
    }
 
    void visit(StringElement element)
    {
        System.out.println("string: " + element.value);
    }
}
GenericElement
interface GenericElement
{
 
    void accept(Visitor visitor);
}
 
class IntElement implements GenericElement
{
 
    public int value = 0;
 
    IntElement(int value)
    {
        this.value = value;
    }
 
    public void accept(Visitor visitor)
    {
        visitor.visit(this);
    }
}
 
class StringElement implements GenericElement
{
 
    public String value = "";
 
    StringElement(String value)
    {
        this.value = value;
    }
 
    public void accept(Visitor visitor)
    {
        visitor.visit(this);
    }
}
Main
public class Main
{
    public static void main(String[] args)
    {
        Traverser t = new Traverser();
        t.visit();
    }
}
Результат
int: 10
string: Hello!