迭代器模式
场景:
提供一种可以遍历聚合对象的方式。又称为游标cursor模式
聚合对象:存储数据
迭代器模式:遍历数据
聚集抽象类 Aggregate
Iterator 迭代抽象类,用于定义得到开始对象,得到下一个对象,判断是否到结尾,当前对象等抽象方法,统一接口
具体聚集类:继承Aggregate
具体迭代器类,继承Iterator,实现开始,下一个,是否结尾,当前对象等方法。
使用场景:
前向迭代器
后向迭代器
List/Set内置的迭代器
/**
* 自定义抽象迭代器接口
*/
package com.bjsxt.cn.iterator;
public interface MyIterator {
public void first();//将游标指向下一个元素
public void last();//将有表指向最后一个元素
public void next();
public boolean hasNext();//判断是否有下一个元素
public boolean isFirst();
public boolean isLast();
public Object CurrentObj();//获取当前对象
}
package com.bjsxt.cn.iterator;
import java.util.ArrayList; import java.util.List; /** * 自定义聚合类 * @author wannachan@outlook.com * */ public class ConcreteMyAggregate { private List<Object> list = new ArrayList<Object>(); public void addObject(Object obj) { list.add(obj); } public Object removeObj(Object obj) { return list.remove(obj); } //获得迭代器 public MyIterator createIterator() { return new ConcreteIterator(); } //使用内部类定义迭代器,可以直接使用外部类的属性 private class ConcreteIterator implements MyIterator {
private int cursor;//定义游标用于记录遍历时的位置 @Override public void first() { cursor = 0; }
@Override public void last() { cursor = list.size() - 1; }
@Override public boolean hasNext() { if (cursor < list.size()) { return true; } return false; }
@Override public boolean isFirst() { return (cursor == 0)?true:false; }
@Override public boolean isLast() { return (cursor == list.size()-1)?true:false; }
@Override public Object CurrentObj() { if (cursor < list.size() ) { return list.get(cursor); } return null; }
@Override public void next() { if (cursor < list.size()) { cursor++; } } } }
/** * 测试类 * 2015年4月11日21:15:43 */ package com.bjsxt.cn.iterator;
public class Client { public static void main(String[] args) { ConcreteMyAggregate cma = new ConcreteMyAggregate(); cma.addObject("AA"); cma.addObject("BB"); cma.addObject(new Student("周杰伦", 10000)); cma.addObject(1); MyIterator iterator = cma.createIterator(); while (iterator.hasNext()) { System.out.println(iterator.CurrentObj()); iterator.next(); } } }
class Student { private String name; private int id; public Student(String name, int id) { super(); this.name = name; this.id = id; } public Student() { }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getId() { return id; }
public void setId(int id) { this.id = id; } @Override public String toString() { return name + " "+ "id 为 " + id; } }
/* * AA BB 周杰伦 id 为 10000 1
* * */
原文地址:http://blog.csdn.net/lk142500/article/details/45000057