迭代器模式(Iterator)
迭代器模式的定义:
提供一种可以遍历聚合对象的方式,又称为:游标cursor模式。
聚合对象:负责存储数据;
迭代器:负责遍历数据。
下面用代码来实现自定义的迭代器:
创建迭代器接口:
package com.note.pattern.Iterator; /** * 自定义的迭代器接口 */ public interface MyIterator { /**将游标指向第一个元素*/ void first(); /**将游标指向下一个元素*/ void next(); /**判断是否存在下一个元素*/ boolean hasNext(); /**判断是不是第一个*/ boolean isFirst(); /**判断是不是最后一个*/ boolean isLast(); /**获取当前游标指向的对象*/ Object getCurrentObj(); }
创建自定义聚合类,在聚合类中将迭代器类作为内部类,可以直接使用外部类的属性:
package com.note.pattern.Iterator; import java.util.ArrayList; import java.util.List; /** * 自定义的聚合类 */ public class ConcreteMyAggregate { private List<Object> list = new ArrayList<Object>(); public void addObject(Object obj) { this.list.add(obj); } public void removeObject(Object obj) { this.list.remove(obj); } public List<Object> getList() { return list; } public void setList(List<Object> list) { this.list = list; } //获得迭代器 public MyIterator createIterator(){ return new ConcreteIterator(); } // 使用内部类定义迭代器,可以直接使用外部类的属性 private class ConcreteIterator implements MyIterator { private int cursor; // 定义游标用于记录遍历时的位置 @Override public void first() { cursor = 0; } @Override public void next() { if (cursor < list.size()) { cursor++; } } @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 getCurrentObj() { return list.get(cursor); } } }
客户端测试:
package com.note.pattern.Iterator; public class Client { public static void main(String[] args) { ConcreteMyAggregate cma = new ConcreteMyAggregate(); cma.addObject("aaa"); cma.addObject("bbb"); cma.addObject("ccc"); MyIterator iterator = cma.createIterator(); while(iterator.hasNext()) { System.out.println(iterator.getCurrentObj()); iterator.next(); } } }
运行结果
aaa bbb ccc