Patrones de diseño Veinte: Iterator (Iterador)

En la vida real, así como la programación, a menudo visitar los diferentes elementos de un objeto polimérico, como " estructura de datos de lista enlazada de recorrido" en la práctica común es crear un recorrido de lista enlazada y se colocan en la misma clase, pero esto forma no es propicio para la extensión, si desea reemplazar los métodos de recorrido debe modificar el código fuente, lo cual es contrario al "principio de apertura y cierre."

Dado que el paquete no es deseable en la clase métodos de recorrido de la polimerización, entonces atravesar el método no proporciona una clase de polimerización, métodos de recorrido implementadas por el propio trabajo del usuario? La respuesta es igualmente indeseable, ya que habrá dos deficiencias de este enfoque:

  1. Clase expone la representación interna de la polimerización, por lo que los datos es inseguro;
  2. El aumento de la carga de los clientes.


"Modo iterativo" puede superar los inconvenientes anteriores, se inserta entre un iterador de polimerización de tipo de clase de acceso de cliente, que separa el objeto agregado y su comportamiento de recorrido, el cliente también oculta sus detalles internos, y satisface una "individuales el principio de responsabilidad "y" el principio de apertura y cierre, "tales como  Java  en la Colección, List, Set Mapa y contener así el iterador.

La definición y características del modelo

Iterador es definido (el iterador) Modo: un objeto proporcionar una serie de acceso secuencial polimerización objeto de datos, la polimerización sin exponer la representación interna del objeto. Iterador es un patrón de comportamiento objeto, sus principales ventajas son las siguientes.

  1. Acceso a una polimerización objeto de contenido sin exponer su representación interna.
  2. Entregado a la tarea completa iterador de recorrido, lo que simplifica la clase de agregación.
  3. Es compatible con diferentes maneras de atravesar una polimerización, incluso personalizar iterador subclase para apoyar el nuevo recorrido.
  4. Añadiendo nuevas clases y clase de iterador de polimerización es muy conveniente, sin necesidad de modificar el código original.
  5. Buena encapsulación proporciona una interfaz unificada para atravesar diferente estructura polimérica.


Sus principales desventajas son: el número de clases aumenta, lo que aumenta la complejidad del sistema hasta cierto punto.

Arquitectura e Implementación Modelo

modo iterativo es aislado por la que atraviesa el objeto fuera del comportamiento de polimerización, abstraído en iterador clase para lograr su objeto en el caso de una estructura interna del objeto agregado no está expuesto, por lo que el acceso al interior transparente de agregación de datos de código externo. Ahora tenemos que analizar la estructura y la implementación básica.

1. Estructura Modelo

Iterator patrón incluye principalmente las siguientes funciones.

  1. polimerización Abstract (agregación) de papeles: la definición de almacenamiento, añadir, borrar, y crean interfaces agregadas objetos iterador objeto.
  2. Específica polimerización (ConcreteAggregate) Papel: poner en práctica la polimerización clase abstracta, devuelve un ejemplos iterador específicos.
  3. Resumen iterador (el iterador) Papel: la definición de elementos de la interfaz de acceso y atravesar la polimerización, que comprende generalmente hasNext (), primero (), método siguiente () y similares.
  4. iterador DETALLADA (Concretelterator) Papel: Abstract implementación de la interfaz iterador definido, traversal completa del objeto agregado, la grabación de la posición actual de la poligonal.


La estructura mostrada en la Figura 1.
 

                                  Modo de la estructura de la figura iterador
 

2. Modo de realización

Iterador códigos de patrones son los siguientes:

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; 
    }   
}

Los resultados del programa son los siguientes: 

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

Modo de ejemplos de aplicación

Iterador patrón está escrito en un navegador Wuyuan escénica de correspondencia de programas de turismo [Ejemplo 1].

Análisis: Wuyuan muchos monumentos, para diseñar una visión atracciones fotos y perfiles del programa, con el diseño "iterador" más apropiado.

En primer lugar, el diseño de una clase de atracciones Wuyuan (WyViewSpot) para mantener los nombres y breve introducción de cada imagen; luego diseñar una interfaz de atracciones situado (ViewSpotSet), que es una agregación clase abstracta, proporcionando adiciones y supresiones Wuyuan métodos atracciones, y iterador de acceso método.

A continuación, definir un conjunto interés Wuyuan (WyViewSpotSet) clase, que es una clase de agregado de concreto, con ArrayList para guardar toda la información sobre las atracciones y poner en práctica el método abstracto en una clase padre; Wuyuan paisaje abstracto iterador de interfaz (ViewSpotltemtor) redefinido, que comprende la información de atracciones método vista.

Por último, la definición de la clase específica de Wuyuan paisaje iterador (WyViewSpotlterator), que implementa la clase padre abstracta; programa diseñado cliente procedimiento de ventana, que los datos (ViewSpotSet) inicializa atracciones Wuyuan establecen, e implementa la interfaz ActionListener, por atracciones Wuyuan iterador (ViewSpotlterator) a la información vista atracciones Wuyuan (WyViewSpot) de. La Figura 2 es una vista estructural.
 

                            Estructura escénica mapa turístico programa de navegación Figura Wuyuan


Código es el siguiente:

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;
    }
}

Resultado del programa se muestra en la Figura 3.
 

                       Resultados de operación Wuyuan programa de mapas de navegación escénica turística

Aplicación de modos de escena

La estructura y características del modo de Iterated delante, la siguiente describe el escenario de aplicación, que normalmente se utiliza en un modo iterativo siguiente situaciones.

  1. Cuando se desea para proporcionar una variedad de maneras de atravesar el objeto agregado.
  2. Cuando se desea proporcionar una interfaz unificada cuando se atraviesa diferente estructura polimérica.
  3. Cuando se accede a una polimerización objeto de contenido sin exponer los detalles de su representación interna.


A causa de polimerización y los iteradores son muy estrecha, por lo que la mayoría de las clases de idiomas en el logro de polimerización proporciona una clase de iterador, utilizando el siguiente lenguaje en el caso de un gran número de clase de iterador de polimerización existente tenido suficiente.

el modo extendido

modo iterativo se asocia a menudo con patrones de combinación usados en combinación cuando la combinación de la modalidad de acceso miembro contenedor, iterador a menudo ocultos en la clase de modo de configuración de conjunto de recipiente. Por supuesto, una configuración también se puede acceder a iterador miembro contenedor externo, la estructura mostrada en la Figura 4.
 

                 diagrama de configuración de modo iterativo de la combinación

 

Publicados 136 artículos originales · ganado elogios 6 · vistas 1539

Supongo que te gusta

Origin blog.csdn.net/weixin_42073629/article/details/104437886
Recomendado
Clasificación