…
好记性不如烂笔头,记录下迭代器模式入我的小仓库
什么是迭代器模式?
迭代器模式就是为了避免暴露内部存储结构而又可以访问该对象的所有元素的接口。
案例
例如有一个高中A校的班级类,通过数组存储学生,若有领导视察,不想暴露存储结构但是又可以让领导浏览到学生名单,该如何做呢?
public class Clazz{
ArrayList<Student> stu = new ArrayList<>();
// ... Clazz other code
}
也许你会说,我在班级类中写一个print()方法,把名条输出出来给领导就可以啦,为啥还要用迭代器模式?
public class AClazz{
StudentArrays[] items = new StudentArray[];
// ... Clazz other code
public void print(){
// here print stu...
}
}
public class Student{
String name;
int age;
// .. other code
}
当然可以!突然这天隔壁初中B校合并到A校中,可是B校使用Map实现存储学生,两校都不愿意更改代码,领导不日就要过来视察,这个时候可怎么办呢?
public class BClazz{
ArrayList list = new ArrayList();
// ... Clazz other code
public void print(){
// here print stu...
}
}
喏!这个时候就可以用到迭代器模式啦!
原理上就是继承迭代器接口,让两个班级类的都实现接口的两个方法hasNext(),next()
最后就完成啦!
interface Iterator{
boolean hasNext();
Object next();
}
class AClazzIterator implements Iterator{
StudentArrays[] items;
int position = 0;
public AClazzIterator (StudentArrays[] items){
this.items = items;
}
@Override
public Object next() {
Student stu = items[position];
position = position + 1;
return stu;
}
@Override
public boolean hasNext() {
if(position >= items.length || items[position] == null){
return false;
}else {
return true;
}
}
}
以上就是A校的班级类改写,最后在A校中引入即可
public class AClazz{
// ... Clazz other code
public Iterator createIterator(){
return new AClazzIterator (items);
}
}
A校的名单最后如何输出呢?
以下是递给领导的方法:
Iterator iterator = new AClazz().createIterator();
while (iterator1.hasNext()){
System.out.println(iterator.next());
}
那么B校的该怎么写呢?
以下是实现框架,内容自行思考
class BClazzIterator implements Iterator{
ArrayList list;
int position = 0;
public BClazzIterator (ArrayList list){
this.list = list;
}
@Override
public Object next() {
// ...
}
@Override
public boolean hasNext() {
// ...
}
}
总结
通过实现Iterator,可以在不暴露内部存在类型的情况下遍历集合对象。