【Java】设计模式之迭代器模式

好记性不如烂笔头,记录下迭代器模式入我的小仓库

什么是迭代器模式?

迭代器模式就是为了避免暴露内部存储结构而又可以访问该对象的所有元素的接口。

案例

例如有一个高中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,可以在不暴露内部存在类型的情况下遍历集合对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值