是 Java 和 .Net 编程环境中非常常用的设计模式
用于顺序访问集合对象的元素,不需要知道集合对象的底层表示
看到这个我想到了java的foreach,就是按顺序迭代集合和数组里的对象,不需要知道长度,从头到尾迭代
菜鸟案例:
我们将创建一个叙述导航方法的 Iterator 接口和一个返回迭代器的 Container 接口。实现了 Container 接口的实体类将负责实现 Iterator 接口。
IteratorPatternDemo,我们的演示类使用实体类 NamesRepository 来打印 NamesRepository 中存储为集合的 Names。
老办法,拆图
一个迭代类的接口和一个它的实现类,方法hasNext 肯定就是判定下一个还存在不,看它的名称和返回类型推出来,而next肯定指向的就是下一个对象了,这样上图的思路就清晰了。
Container 接口里有获取迭代类的接口,老套路,返回类型虽然是接口类型,但是肯定返回的是它的实体类。,NameRepository 里面就是自己需要迭代的对象额,看到name数组了,获取迭代器类肯定即使为了迭代和判断name数组是否有值了,
现在主要是看它这俩怎么整合的。那就看代码吧
代码
(1)创建接口:
Iterator.java
public interface Iterator {
public boolean hasNext();
public Object next();
}
Container.java
public interface Container {
public Iterator getIterator();
}
(2)创建实现了 Container 接口的实体类。该类有实现了 Iterator 接口的内部类 NameIterator(也可以不用内部类,外部类也行,这样只是为了不让外部的类调用)
NameRepository.java
public class NameRepository implements Container {
public String names[] = {"Robert" , "John" ,"Julie" , "Lora"};
@Override
public Iterator getIterator() {
//返回一个内部类对象,通过这样的方式让外部来获取此类的内部类对象
return new NameIterator();
}
//内部类实现了Iterator 的接口
private class NameIterator implements Iterator {
//默认初始值为0,为了不出现别的问题,建议给初始值
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;
}
}
}
(3)使用 NameRepository 来获取迭代器,并打印名字。
IteratorPatternDemo.java
public class IteratorPatternDemo {
public static void main(String[] args) {
NameRepository namesRepository = new NameRepository();
//这个就是正常的for循环,第一个参数获取对象,第二个是判定结束的条件,第三个可加可不加,
for(Iterator iter = namesRepository.getIterator(); iter.hasNext();){
String name = (String)iter.next();
System.out.println("Name : " + name);
}
}
}
执行程序,输出结果:
Name : Robert
Name : John
Name : Julie
Name : Lora
————————————————
版权声明:本文为CSDN博主「胖墩的IT」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43113679/article/details/99550739