Шаблоны двадцать-один: шаблон посетителя (посетители)

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

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

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

Определение и характеристика модели

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

Посетители (посетителей) модель является объектом модель поведения, его основные преимущества заключаются в следующем.

  1. Хорошая масштабируемость. Вполне возможно, без изменения структуры объектов элементов, добавлять новые функции к элементам структуры объекта.
  2. Хорошее повторное использование. Весь объект может быть определен с помощью общих структурных особенностей посетителя, тем самым увеличивая степень мультиплексирование системы.
  3. Хорошая гибкость. Структура данных в режиме онлайн применяется к работе расцепления структуры, таким образом, что операция может быть установлена ​​относительно свободно, не влияя на эволюцию структур данных системы.
  4. В соответствии с принципом единой ответственности. Связанные с этим моделью поведение посетителя упакованное вместе, составляет посетитель, так что каждая функция посетителя относительно проста.


Основной недостаток режима посетителей (посетители) следующим образом.

  1. Добавление новых элементов класса трудно. В режиме посетителей, каждый новый тип элемента, имеют соответствующее увеличение работы конкретного конкретного посетителя каждого класса, что противоречит «принципу включения-выключения».
  2. Нарушать инкапсуляцию. Публичные картины конкретные элементы опубликованных деталей посетителя, этот разрыв объекта капсулирования.
  3. Нарушает Принцип инверсии зависимостей. шаблон для посетителей в зависимости от конкретной категории, но не полагаться на абстрактные классы.

Архитектура и реализация модели

Режим Key посетителя (посетителей), как достичь рабочего элемента, действующий на отдельном пакете в отдельные классы, базовая структура и способ заключается в следующем.

1. Структура модели

Посетитель шаблон состоит из следующих главных ролей.

  1. Абстрактный посетителя (посетителей) Роли: определить интерфейс для доступа к конкретному элементу, для каждого класса, соответствующего конкретной операции доступа элемента Визит (), тип операции, параметр идентифицирует конкретный элемент, чтобы получить доступ.
  2. Конкретные посетители (ConcreteVisitor) Роль: Реферат Роль посетителей объявлено в каждой операции доступа, чтобы определить, что делать, когда посетитель обращается к элементам.
  3. Абстрактные элементы (элемент) роль: декларация, содержащая интерфейс операционной принимает принять (), и принял объект посетителя в качестве параметра принимает метод ().
  4. ПОДРОБНЫЙ элемент (ConcreteElement) Роль: абстрактный элемент символов при условии, принимает () операцию, которая, как правило, способ их visitor.visit (это), она специально связанные элементы могут также содержать самое логическую операцию службы.
  5. Структура объекта (структура объекта) Роль: Роль представляет собой контейнер, содержащий элемент обеспечивают все элементы для посетителей, чтобы пройти через объекты в методе контейнера, как правило, осуществляются List, Set Map и другим классом полимеризации.


Структура, показанная на фиг.1.
 

                        Режим фиг структура посетителя (посетителей)
 

2. Способ реализации

Посетитель кодовая реализация выглядит следующим образом:

package visitor;
import java.util.*;
public class VisitorPattern
{
    public static void main(String[] args)
    {
        ObjectStructure os=new ObjectStructure();
        os.add(new ConcreteElementA());
        os.add(new ConcreteElementB());
        Visitor visitor=new ConcreteVisitorA();
        os.accept(visitor);
        System.out.println("------------------------");
        visitor=new ConcreteVisitorB();
        os.accept(visitor);
    }
}
//抽象访问者
interface Visitor
{
    void visit(ConcreteElementA element);
    void visit(ConcreteElementB element);
}
//具体访问者A类
class ConcreteVisitorA implements Visitor
{
    public void visit(ConcreteElementA element)
    {
        System.out.println("具体访问者A访问-->"+element.operationA());
    }
    public void visit(ConcreteElementB element)
    {
        System.out.println("具体访问者A访问-->"+element.operationB());
    }
}
//具体访问者B类
class ConcreteVisitorB implements Visitor
{
    public void visit(ConcreteElementA element)
    {
        System.out.println("具体访问者B访问-->"+element.operationA());
    }
    public void visit(ConcreteElementB element)
    {
        System.out.println("具体访问者B访问-->"+element.operationB());
    }
}
//抽象元素类
interface Element
{
    void accept(Visitor visitor);
}
//具体元素A类
class ConcreteElementA implements Element
{
    public void accept(Visitor visitor)
    {
        visitor.visit(this);
    }
    public String operationA()
    {
        return "具体元素A的操作。";
    }
}
//具体元素B类
class ConcreteElementB implements Element
{
    public void accept(Visitor visitor)
    {
        visitor.visit(this);
    }
    public String operationB()
    {
        return "具体元素B的操作。";
    }
}
//对象结构角色
class ObjectStructure
{   
    private List<Element> list=new ArrayList<Element>();   
    public void accept(Visitor visitor)
    {
        Iterator<Element> i=list.iterator();
        while(i.hasNext())
        {
            ((Element) i.next()).accept(visitor);
        }      
    }
    public void add(Element element)
    {
        list.add(element);
    }
    public void remove(Element element)
    {
        list.remove(element);
    }
}

Операционные результаты программы заключаются в следующем: 

具体访问者A访问-->具体元素A的操作。
具体访问者A访问-->具体元素B的操作。
------------------------
具体访问者B访问-->具体元素A的操作。
具体访问者B访问-->具体元素B的操作。

Режим примеров применения

[Пример 1] с использованием режима «Visitor (Посетитель)«Analog Arts и Чеканка компании функциональный.

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

Во- первых, определение интерфейса (компании) компании, которая является абстрактным посетителей, предоставляет два метода для создания работ в бумаге (бумага) или меди (Cuprum) из этих двух элементов, переопределение Arts (ArtCompany) класс и чеканка компания (Мятный) класс, которые специфичен посетитель, реализует метод родительского интерфейса, а затем, определяет материал (материал) интерфейс, который является абстрактным элементом, при условии , принимает (посетитель компании) способ приема посетителей (компании) объект доступ; переопределение бумага (бумага) класс и меди (Купрум) класс, которые представляют собой особый тип элемента, реализует метод на родительском интерфейсе; наконец, определить материал коллектора (SetMaterial) класса, который является объектом ролей, сохранил все контейнер Список элементов, а также обеспечить для посетителей , чтобы пройти объект принимает все элементы контейнера (посетитель компании) метод, категорию клиентов , предназначенную для формирования программы , которая предусматривает материальный набор (SetMaterial) объекты для посетителей (компании) доступ к объектам, ItemListener реализует интерфейс, обработки событий запросов пользователей. Фиг.2 представляет собой структурный вид.
 

                 Искусство и Чеканка Структура компании график


Код выглядит следующим образом:

package visitor;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
public class VisitorProducer
{
    public static void main(String[] args)
    {
        new MaterialWin();       
    }
}
//窗体类
class MaterialWin extends JFrame implements ItemListener
{
    private static final long serialVersionUID=1L;   
    JPanel CenterJP;
    SetMaterial os;    //材料集对象
    Company visitor1,visitor2;    //访问者对象
    String[] select;
    MaterialWin()
    {
        super("利用访问者模式设计艺术公司和造币公司");
        JRadioButton Art;
        JRadioButton mint;           
        os=new SetMaterial();     
        os.add(new Cuprum());
        os.add(new Paper());
        visitor1=new ArtCompany();//艺术公司
        visitor2=new Mint(); //造币公司      
        this.setBounds(10,10,750,350);            
        this.setResizable(false);       
        CenterJP=new JPanel();       
        this.add("Center",CenterJP);      
        JPanel SouthJP=new JPanel();
        JLabel yl=new JLabel("原材料有:铜和纸,请选择生产公司:");
        Art=new JRadioButton("艺术公司",true);
        mint=new JRadioButton("造币公司");
        Art.addItemListener(this);
        mint.addItemListener(this);       
        ButtonGroup group=new ButtonGroup();
        group.add(Art);
        group.add(mint);
        SouthJP.add(yl);
        SouthJP.add(Art);
        SouthJP.add(mint);
        this.add("South",SouthJP);       
        select=(os.accept(visitor1)).split(" ");    //获取产品名
        showPicture(select[0],select[1]);    //显示产品
    }
    //显示图片
    void showPicture(String Cuprum,String paper)
    {
        CenterJP.removeAll();    //清除面板内容
        CenterJP.repaint();    //刷新屏幕
        String FileName1="src/visitor/Picture/"+Cuprum+".jpg";
        String FileName2="src/visitor/Picture/"+paper+".jpg";
        JLabel lb=new JLabel(new ImageIcon(FileName1),JLabel.CENTER);
        JLabel rb=new JLabel(new ImageIcon(FileName2),JLabel.CENTER);
        CenterJP.add(lb);
        CenterJP.add(rb);
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);            
    }
    @Override
    public void itemStateChanged(ItemEvent arg0)
    {
        JRadioButton jc=(JRadioButton) arg0.getSource();
        if (jc.isSelected())
        {
            if (jc.getText()=="造币公司")
            {
                select=(os.accept(visitor2)).split(" ");
            }
            else
            {            
                select=(os.accept(visitor1)).split(" ");
            }
            showPicture(select[0],select[1]);    //显示选择的产品
        }    
    }
}
//抽象访问者:公司
interface Company
{
    String create(Paper element);
    String create(Cuprum element);
}
//具体访问者:艺术公司
class ArtCompany implements Company
{
    public String create(Paper element)
    {
        return "讲学图";
    }
    public String create(Cuprum element)
    {
        return "朱熹铜像";
    }
}
//具体访问者:造币公司
class Mint implements Company
{
    public String create(Paper element)
    {
        return "纸币";
    }
    public String create(Cuprum element)
    {
        return "铜币";
    }
}
//抽象元素:材料
interface Material
{
    String accept(Company visitor);
}
//具体元素:纸
class Paper implements Material
{
    public String accept(Company visitor)
    {
        return(visitor.create(this));
    }
}
//具体元素:铜
class Cuprum implements Material
{
    public String accept(Company visitor)
    {
        return(visitor.create(this));
    }
}
//对象结构角色:材料集
class SetMaterial
{   
    private List<Material> list=new ArrayList<Material>();   
    public String accept(Company visitor)
    {
        Iterator<Material> i=list.iterator();
        String tmp="";
        while(i.hasNext())
        {
            tmp+=((Material) i.next()).accept(visitor)+" ";
        }
        return tmp; //返回某公司的作品集     
    }
    public void add(Material element)
    {
        list.add(element);
    }
    public void remove(Material element)
    {
        list.remove(element);
    }
}

Результат программы, показанной на рисунке 3.
 

      Art разработанные продукты
(A) Art разработанные продукты

 

         Mint выпустил деньги

 

Применение сюжетных

В целом можно рассматривать в случае режима посетителей (Visitor).

  1. Структура объекта является относительно стабильной, но часто меняется алгоритм работы программы.
  2. Структура данного объекта должна обеспечить разнообразие различных, не связанных между собой операций, но и избежать эти изменения влияют на работу структуры объекта.
  3. Структура объекта содержит множество типов объектов, некоторые из желательных вариантов осуществления этих объектов зависят от его конкретного типа операции.

Расширенный режим

Посетители модели (Посетитель) часто используется один вид шаблона проектирования , это часто связано с использованием двух шаблонов проектирования.

(1) и « итеративный режим » в комбинации. Так как режим посетителя «объект структура» представляет собой контейнер элемент содержит символ, когда посетители траверс всех элементы контейнера, часто используют итераторы. Структура объекта [Пример 1] с использованием списка будет реализована, он получает через итератор объект метода Itemtor Список (). Если объект класса структура полимеризации не обеспечивает итераторы, это может быть пользовательский итеративный режим.

(2) посетитель (посетитель) режим с « комбинированным режимом » в комбинации. Так как посетитель (посетитель) режим «целевого элемента» может быть листовой объект или объект - контейнер, если объект является объект - контейнер , содержащий элемент, необходимо использовать режим комбинации , структуру , показанную на рисунке 4.
 

                 Фигура конфигурация модели посетителя содержит комбинацию узоров

 

 

 

 

 

Опубликовано 136 оригинальных статей · вона похвала 6 · просмотров 1538

рекомендация

отblog.csdn.net/weixin_42073629/article/details/104437896