[设计模式] 浅谈迭代器模式
迭代器模式
模式功能说明:不同种类的对象可能需要不同的遍历方式,我们对每一种类型的对象配一个迭代器。
案例
//定义迭代器接口
interface Iterator {
boolean hasNext();
Object next();
}
//定义容器接口
interface Container {
Iterator getIterator();
}
//实现容器接口的具体类
class NameRepository implements Container {
public String names[] = {"Robert" , "John" ,"Julie" , "Lora"};
@Override
public Iterator getIterator() {
return new NameIterator();
}
private class NameIterator implements Iterator {
int index;
@Override
public boolean hasNext() {
if(index < names.length){
return true;
}
return false;
}
@Override
public Object next() {
if(this.hasNext()){
return names[index++];
}
return null;
}
}
}
//使用
public class IteratorPatternDemo {
public static void main(String[] args) {
NameRepository namesRepository = new NameRepository();
for(Iterator iter = namesRepository.getIterator(); iter.hasNext();){
String name = (String)iter.next();
System.out.println("Name : " + name);
}
}
}
我们首先定义了一个迭代器接口(Iterator)和一个容器接口(Container)。然后我们创建了一个具体的容器(NameRepository),它实现了Container接口,并内部定义了一个具体的迭代器(NameIterator),它实现了Iterator接口。最后,在客户端代码中,我们使用这个具体的容器和迭代器来遍历所有的元素。
使用场景:
- 访问一个聚合对象的内容而无需暴露它的内部表示。
- 需要为聚合对象提供多种遍历方式。
- 为遍历不同的聚合结构提供一个统一的接口。
优缺点
优点:
- 它支持以不同的方式遍历一个聚合对象。
- 迭代器简化了聚合类。
- 在同一个聚合上可以有多个遍历。
- 在迭代器模式中,增加新的聚合类和迭代器类都很方便,无需修改原有代码。
缺点:
- 由于迭代器模式遵循了“单一职责原则”,即一个类应该只有一个引起变化的原因。在这个模式中,迭代的逻辑被放在了迭代器类中,而不是在容器类中。
总结
状态模式实现了设计原则中的“开闭原则”,即对扩展开放,对修改关闭。在状态模式中,我们可以通过添加新的状态类来增加新的状态和转换,而不是修改已有的代码。 迭代器模式可以把迭代的过程从业务逻辑中分离出来,在使用迭代器模式之后,即使不关心对象的内部构造,也可以按顺序访问其中的每个元素。