В реальной жизни, а также программирования, часто посещают различные элементы полимерного объекта, такие как « структура данных связный список обхода» в общей практике , чтобы создать связанный список обхода и размещены в том же классе, но это путь не способствует расширению, если вы хотите заменить методы обхода необходимо изменить исходный код, который противоречит «принципу открытия и закрытия.»
Поскольку пакет не является желательным в классе методов полимеризации обхода, затем траверс метод не обеспечивает класс полимеризации, методы обхода , реализуемые собственной работой пользователя? Ответ одинаково нежелательны, потому что будет два недостатки такого подхода:
- Класс раскрывает внутреннее представление полимеризации, так что данные небезопасно;
- Увеличение нагрузки на клиентах.
«Итеративный режим» может преодолеть вышеуказанные недостатки, он вставляется между типом класса итератора полимеризацией клиентского доступа, который отделяет совокупный объект и его поведение обхода, клиент также скрывает свои внутренние детали, и удовлетворяет «одиночные принцип ответственности «и» принцип открытия и закрытия « , такие как Java , в сборе, List, Set Map и так содержит итератор.
Определение и характеристика модели
Итератора определяется (итератор) Режим: объект, чтобы обеспечить серию полимеризации объектов данных последовательного доступа, полимеризация без воздействия на внутреннее представлении объекта. Итератора является объектом модель поведения, его основные преимущества заключаются в следующем.
- Доступ к полимеризации с содержанием объекта, не подвергая его внутреннее представление.
- Передам задачу полного обхода итератор, который упрощает класс агрегации.
- Он поддерживает различные способы, чтобы пройти полимеризацию, даже настроить итератор подкласс для поддержки нового обхода.
- Добавьте новый класс полимерного класса итератора и легко, без изменения исходного кода.
- Хорошая инкапсуляция обеспечивает единый интерфейс для траверс другой полимерной структуры.
Ее основными недостатками являются: число классов увеличивается, что увеличивает сложность системы до некоторой степени.
Архитектура и реализация модели
Итеративный режим выделяет путем обхода объекта из поведения полимеризации, забираемое в итераторе класс, чтобы достичь своей цели в случае внутренней структуры совокупного объекта не подвергаются, так что доступ к агрегации внутренней прозрачной внешнему кода данных. Теперь мы должны проанализировать основную структуру и реализацию.
1. Структура модели
Итератор модель в основном включает в себя следующие роли.
- Аннотация полимеризация (Совокупная) роль: определение хранения, добавлять, удалять и создавать объекты интерфейса объекта полимеризации итератора.
- Конкретная полимеризации (ConcreteAggregate) Роль: осуществить полимеризацию абстрактного класса, он возвращает примеры конкретного итератора.
- Абстрактный итератор (итератор) Роль: определение элементов интерфейса доступа и пересекает полимеризацию, как правило, содержащая hasNext (), первый (), следующий метод () и тому подобные.
- ПОДРОБНЫЙ итератор (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.
Применение сюжетных
Структура и характеристика режима переднего повторного, ниже описан сценарий приложения, обычно используемый в итерационном режиме следующих ситуаций.
- Когда требуется, чтобы обеспечить разнообразие способов пересекающих агрегатный объект.
- Когда желательно, чтобы обеспечить однородный интерфейс к другому полимерной структуре времени обхода.
- При обращении к полимеризации с содержанием объекта, не подвергая детали его внутреннего представления.
Из-за полимеризации и итераторов очень близко, поэтому большинство классов языка в достижении полимеризации обеспечивает класс итератора, используя следующий язык в случае большого количества существующего класса полимеризации итератора были достаточно.
Расширенный режим
Итеративный режим часто связан с комбинацией шаблонами , используемых в комбинации , когда комбинация режима доступа члена контейнера, итератор часто скрыта в контейнере сборка класса режима конфигурации. Конечно, конфигурация может быть также доступна итератор внешнего элемента контейнера, структура , показанной на рисунке 4.