您的位置:首页 > 其它

设计模式学习笔记(17)——迭代器模式

2015-05-21 16:55 363 查看
迭代器模式其实是一个过时的产物,Java与C#均已实现该模式,此处更多的是理解迭代器的原理!

一、模式定义
提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示
二、模式结构



三、模式实现
Iterator : 定义访问元素的接口。
interface Iterator {
public Object first();
public Object next();
public boolean isDone();
public Object currentItem();
}

ConcreteIterator : 实现 Iterator 接口。记录当前访问的元素在集合中的位置信息。
class ConcreteIterator implements Iterator {

private int current = 0;

private ConcreteAggregate aggregate;

public ConcreteIterator(ConcreteAggregate aggregate) {

this.aggregate = aggregate;

}

@Override

public Object first() {

return aggregate.get(0);

}

@Override

public Object next() {

current++;

if (current < aggregate.size()) {

return aggregate.get(current);

}

return null;

}

@Override

public boolean isDone() {

return (current >= aggregate.size()) ? true : false;

}

@Override

public Object currentItem() {

return aggregate.get(current);

}

}

Aggregate : 定义创建 Iterator 对象的接口。
interface Aggregate {
public Iterator CreateIterator();
}

ConcreteAggregate : 实现 Iterator 接口,返回一个合适的 ConcreteIterator 实例。

class ConcreteAggregate implements Aggregate {

private List<Object> items = new ArrayList<Object>();

@Override

public Iterator CreateIterator() {

return new ConcreteIterator(this);

}

public int size() {

return items.size();

}

public Object get(int index) {

return items.get(index);

}

public void set(int index, Object element) {

items.set(index, element);

}

public void add(Object element) {

items.add(element);

}

}

测试代码

public class IteratorPattern {

public static void main(String[] args) {

ConcreteAggregate aggregate = new ConcreteAggregate();

aggregate.add("张三");

aggregate.add("李四");

aggregate.add("王五");

aggregate.add("赵六");

Iterator iter = new ConcreteIterator(aggregate);

Object item = iter.first();

System.out.println("第一个人是:" + item);

System.out.println("所有人的名单是:");

while (!iter.isDone()) {

System.out.println(iter.currentItem());

iter.next();

}

}

}

运行结果

第一个人是:张三

所有人的名单是:

张三

李四

王五

赵六

[b]四、使用场景[/b]
1、访问一个聚合对象的内容而无须暴露它的内部表示。

2、需要为聚合对象提供多种遍历方式。

3、为遍历不同的聚合结构提供一个统一的接口。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: