Шаблоны Twenty: Итератор (Iterator)

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

Поскольку пакет не является желательным в классе методов полимеризации обхода, затем траверс метод не обеспечивает класс полимеризации, методы обхода , реализуемые собственной работой пользователя? Ответ одинаково нежелательны, потому что будет два недостатки такого подхода:

  1. Класс раскрывает внутреннее представление полимеризации, так что данные небезопасно;
  2. Увеличение нагрузки на клиентах.


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

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

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

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


Ее основными недостатками являются: число классов увеличивается, что увеличивает сложность системы до некоторой степени.

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

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

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

Итератор модель в основном включает в себя следующие роли.

  1. Аннотация полимеризация (Совокупная) роль: определение хранения, добавлять, удалять и создавать объекты интерфейса объекта полимеризации итератора.
  2. Конкретная полимеризации (ConcreteAggregate) Роль: осуществить полимеризацию абстрактного класса, он возвращает примеры конкретного итератора.
  3. Абстрактный итератор (итератор) Роль: определение элементов интерфейса доступа и пересекает полимеризацию, как правило, содержащая hasNext (), первый (), следующий метод () и тому подобные.
  4. ПОДРОБНЫЙ итератор (Concretelterator) Роль: Абстрактная реализация итератора интерфейса, определенная, полный обход совокупного объекта, записи текущего положения траверсы.


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

                                  Режим структуры фиг итератора
 

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

Итератора шаблон коды следующим образом:

package iterator;
import java.util.*;
public class IteratorPattern
{
    public static void main(String[] args)
    {
        Aggregate ag=new ConcreteAggregate(); 
        ag.add("中山大学"); 
        ag.add("华南理工"); 
        ag.add("韶关学院");
        System.out.print("聚合的内容有:");
        Iterator it=ag.getIterator(); 
        while(it.hasNext())
        { 
            Object ob=it.next(); 
            System.out.print(ob.toString()+"\t"); 
        }
        Object ob=it.first();
        System.out.println("\nFirst:"+ob.toString());
    }
}
//抽象聚合
interface Aggregate
{ 
    public void add(Object obj); 
    public void remove(Object obj); 
    public Iterator getIterator(); 
}
//具体聚合
class ConcreteAggregate implements Aggregate
{ 
    private List<Object> list=new ArrayList<Object>(); 
    public void add(Object obj)
    { 
        list.add(obj); 
    }
    public void remove(Object obj)
    { 
        list.remove(obj); 
    }
    public Iterator getIterator()
    { 
        return(new ConcreteIterator(list)); 
    }     
}
//抽象迭代器
interface Iterator
{
    Object first();
    Object next();
    boolean hasNext();
}
//具体迭代器
class ConcreteIterator implements Iterator
{ 
    private List<Object> list=null; 
    private int index=-1; 
    public ConcreteIterator(List<Object> list)
    { 
        this.list=list; 
    } 
    public boolean hasNext()
    { 
        if(index<list.size()-1)
        { 
            return true;
        }
        else
        {
            return false;
        }
    }
    public Object first()
    {
        index=0;
        Object obj=list.get(index);;
        return obj;
    }
    public Object next()
    { 
        Object obj=null; 
        if(this.hasNext())
        { 
            obj=list.get(++index); 
        } 
        return obj; 
    }   
}

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

聚合的内容有:中山大学    华南理工    韶关学院   
First:中山大学

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

Итератор шаблон записывается в браузере Wuyuan живописных туристических карт [Пример 1].

Анализ: Уюаньте много памятников, чтобы проектировать вид достопримечательность фотографию и профили программы, с «Итератором рисунок» дизайном более подходящим.

Во- первых, создать класс Уюань достопримечательности (WyViewSpot) для хранения имен и краткое введение каждого изображения, а затем создать набор достопримечательности (ViewSpotSet) интерфейс, который является агрегация абстрактный класс, обеспечивающий добавления и удаления Уюань методов аттракционы и итератор доступа метод.

Затем определить процентную набор Wuyuan (WyViewSpotSet) класс, который представляет собой конкретный агрегат класса, с ArrayList , чтобы сохранить всю информацию о достопримечательностях и реализовать абстрактный метод в родительском классе, переопределены Уюань пейзаж абстрактный итератор интерфейса (ViewSpotltemtor), содержащий информация способ посмотреть достопримечательности.

И, наконец, определение Уюаньте ландшафт конкретного итератора (WyViewSpotlterator) класс, который реализует абстрактный родительский класс; клиентская программа разработана оконная процедура, которой данные (ViewSpotSet) инициализирует набор Уюаньте достопримечательности, и реализует интерфейс ActionListener, по Уюань достопримечательности итератор (ViewSpotlterator) для просмотра информации Уюань достопримечательности (WyViewSpot) из. Фиг.2 представляет собой структурный вид.
 

                            Структура Рисунок Уюань живописные туристические карты программа просмотра


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

package iterator;
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import javax.swing.*;
public class PictureIterator{
    public static void main(String[] args)
    {
        new PictureFrame();
    }
}
//相框类
class PictureFrame extends JFrame implements ActionListener
{
    private static final long serialVersionUID=1L;
    ViewSpotSet ag; //婺源景点集接口
    ViewSpotIterator it; //婺源景点迭代器接口
    WyViewSpot ob;    //婺源景点类
    PictureFrame()
    {
        super("中国最美乡村“婺源”的部分风景图");
        this.setResizable(false);
        ag=new WyViewSpotSet(); 
        ag.add(new WyViewSpot("江湾","江湾景区是婺源的一个国家5A级旅游景区,景区内有萧江宗祠、永思街、滕家老屋、婺源人家、乡贤园、百工坊等一大批古建筑,精美绝伦,做工精细。")); 
        ag.add(new WyViewSpot("李坑","李坑村是一个以李姓聚居为主的古村落,是国家4A级旅游景区,其建筑风格独特,是著名的徽派建筑,给人一种安静、祥和的感觉。")); 
        ag.add(new WyViewSpot("思溪延村","思溪延村位于婺源县思口镇境内,始建于南宋庆元五年(1199年),当时建村者俞氏以(鱼)思清溪水而名。"));
        ag.add(new WyViewSpot("晓起村","晓起有“中国茶文化第一村”与“国家级生态示范村”之美誉,村屋多为清代建筑,风格各具特色,村中小巷均铺青石,曲曲折折,回环如棋局。")); 
        ag.add(new WyViewSpot("菊径村","菊径村形状为山环水绕型,小河成大半圆型,绕村庄将近一周,四周为高山环绕,符合中国的八卦“后山前水”设计,当地人称“脸盆村”。")); 
        ag.add(new WyViewSpot("篁岭","篁岭是著名的“晒秋”文化起源地,也是一座距今近六百历史的徽州古村;篁岭属典型山居村落,民居围绕水口呈扇形梯状错落排布。"));
        ag.add(new WyViewSpot("彩虹桥","彩虹桥是婺源颇有特色的带顶的桥——廊桥,其不仅造型优美,而且它可在雨天里供行人歇脚,其名取自唐诗“两水夹明镜,双桥落彩虹”。")); 
        ag.add(new WyViewSpot("卧龙谷","卧龙谷是国家4A级旅游区,这里飞泉瀑流泄银吐玉、彩池幽潭碧绿清新、山峰岩石挺拔奇巧,活脱脱一幅天然泼墨山水画。"));
        it = ag.getIterator(); //获取婺源景点迭代器 
        ob = it.first(); 
        this.showPicture(ob.getName(),ob.getIntroduce());
    }
    //显示图片
    void showPicture(String Name,String Introduce)
    {       
        Container cp=this.getContentPane();       
        JPanel picturePanel=new JPanel();
        JPanel controlPanel=new JPanel();       
        String FileName="src/iterator/Picture/"+Name+".jpg";
        JLabel lb=new JLabel(Name,new ImageIcon(FileName),JLabel.CENTER);   
        JTextArea ta=new JTextArea(Introduce);       
        lb.setHorizontalTextPosition(JLabel.CENTER);
        lb.setVerticalTextPosition(JLabel.TOP);
        lb.setFont(new Font("宋体",Font.BOLD,20));
        ta.setLineWrap(true);       
        ta.setEditable(false);
        //ta.setBackground(Color.orange);
        picturePanel.setLayout(new BorderLayout(5,5));
        picturePanel.add("Center",lb);       
        picturePanel.add("South",ta);       
        JButton first, last, next, previous;
        first=new JButton("第一张");
        next=new JButton("下一张");
        previous=new JButton("上一张");
        last=new JButton("最末张");
        first.addActionListener(this);
        next.addActionListener(this);
        previous.addActionListener(this);
        last.addActionListener(this);        
        controlPanel.add(first);
        controlPanel.add(next);
        controlPanel.add(previous);
        controlPanel.add(last);       
        cp.add("Center",picturePanel);
        cp.add("South",controlPanel);
        this.setSize(630, 550);
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    @Override
    public void actionPerformed(ActionEvent arg0)
    {
        String command=arg0.getActionCommand();
        if(command.equals("第一张"))
        {
            ob=it.first(); 
            this.showPicture(ob.getName(),ob.getIntroduce());
        }
        else if(command.equals("下一张"))
        {
            ob=it.next(); 
            this.showPicture(ob.getName(),ob.getIntroduce());
        }
        else if(command.equals("上一张"))
        {
            ob=it.previous(); 
            this.showPicture(ob.getName(),ob.getIntroduce());
        }
        else if(command.equals("最末张"))
        {
            ob=it.last(); 
            this.showPicture(ob.getName(),ob.getIntroduce());
        }
    }
}
//婺源景点类
class WyViewSpot
{
    private String Name;
    private String Introduce;
    WyViewSpot(String Name,String Introduce)
    {
        this.Name=Name;
        this.Introduce=Introduce;
    }
    public String getName()
    {
        return Name;
    }
    public String getIntroduce()
    {
        return Introduce;
    }
}
//抽象聚合:婺源景点集接口
interface ViewSpotSet
{ 
    void add(WyViewSpot obj); 
    void remove(WyViewSpot obj); 
    ViewSpotIterator getIterator(); 
}
//具体聚合:婺源景点集
class WyViewSpotSet implements ViewSpotSet
{ 
    private ArrayList<WyViewSpot> list=new ArrayList<WyViewSpot>(); 
    public void add(WyViewSpot obj)
    { 
        list.add(obj); 
    }
    public void remove(WyViewSpot obj)
    { 
        list.remove(obj); 
    }
    public ViewSpotIterator getIterator()
    { 
        return(new WyViewSpotIterator(list)); 
    }     
}
//抽象迭代器:婺源景点迭代器接口
interface ViewSpotIterator
{
    boolean hasNext();
    WyViewSpot first();
    WyViewSpot next();
    WyViewSpot previous();
    WyViewSpot last(); 
}
//具体迭代器:婺源景点迭代器
class WyViewSpotIterator implements ViewSpotIterator
{ 
    private ArrayList<WyViewSpot> list=null; 
    private int index=-1;
    WyViewSpot obj=null;
    public WyViewSpotIterator(ArrayList<WyViewSpot> list)
    {
        this.list=list; 
    } 
    public boolean hasNext()
    { 
        if(index<list.size()-1)
        { 
            return true;
        }
        else
        {
            return false;
        }
    }
    public WyViewSpot first()
    {
        index=0;
        obj=list.get(index);
        return obj;
    }
    public WyViewSpot next()
    {         
        if(this.hasNext())
        { 
            obj=list.get(++index);
        } 
        return obj; 
    }
    public WyViewSpot previous()
    { 
        if(index>0)
        { 
            obj=list.get(--index); 
        } 
        return obj; 
    }
    public WyViewSpot last()
    {
        index=list.size()-1;
        obj=list.get(index);
        return obj;
    }
}

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

                       Операционные результаты Уюаньте сценические туристическую программу просмотра карт

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

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

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


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

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

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

                 Итеративная режим конфигурации схема комбинации

 

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

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

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