设计模式之迭代器模式-消灭傻瓜遍历(Iterator)

问题

迭代器模式其实很好理解,不过我还是举一个我的电脑城的问题来引入吧。话说我的仓库存了50台电脑,今天的打算给我的企业客户运送过去。卡车司机到仓库门口说来运50台电脑,管理员跟司机说:你再仓库的西南角搬20台,再到中间区域搬10台,再到北边搬10台,再到东边搬10台。说完司机就怒了,说你想累死我啊,你就一台一台往仓库门口放,我就一台一台往车上运,其他的我不管。这就是迭代器模式

实现

先看下电脑的实现,加个index,标明序号

public class Computer {

    private int index;

    public Computer(int index) {
        this.index = index;
    }

    @Override
    public String toString() {
        return "get Computer " + index;
    }
}

然后是仓库,迭代器用的是java自带的,实现都一样

public class WareHouse implements Iterator<Computer> {

    private List<Computer> computerList;

    private Computer[] computers;

    private int index = 0;

    private Iterator<Computer> iterator;

    public WareHouse() {
        computerList = new ArrayList<>();
        computers = new Computer[10];
        iterator = this;
        init();
    }

    public Iterator<Computer> getIterator() {
        return iterator;
    }

    private void init() {
        for (int i = 0; i < 10; i++) {
            Computer computer = new Computer(i);
            Computer computer1 = new Computer(i + 10);
            computerList.add(computer);
            computers[i] = computer1;
        }
    }

    @Override
    public boolean hasNext() {
        return index <= 19;
    }

    @Override
    public Computer next() {
        Computer computer = index <= 9 ? computerList.get(index):computers[index - 10];
        index++;
        return computer;
    }
}

看下执行代码

    public static void main(String[] args) {
        WareHouse wareHouse = new WareHouse();
        Iterator<Computer> iterator = wareHouse.getIterator();
        while (iterator.hasNext()) {
            Computer computer = iterator.next();
            System.out.println(computer.toString());
        }
    }

执行结果

get Computer 0
get Computer 1
get Computer 2
get Computer 3
get Computer 4
get Computer 5
get Computer 6
get Computer 7
get Computer 8
get Computer 9
get Computer 10
get Computer 11
get Computer 12
get Computer 13
get Computer 14
get Computer 15
get Computer 16
get Computer 17
get Computer 18
get Computer 19

总结

我不关心电脑在仓库里是如何存放的,我只要求我可以一个一个的取,迭代器模式就是提供了这个功能。程序员对迭代器应该都比较熟悉,经常会遇到。可能刚开始遇到的时候,会疑惑这个新出的iterator有什么用,我一个for循环就可以搞定的事,还要用iterator来做,多麻烦。当然在平常开发过程中,我们更多地遇到的是一些常见的容器类,例如List,数组,Map呀等等。因为我们比较清楚其内部实现,也就可以知道如何去做循环查询操作。

当我们遇到一些不熟悉或者复杂的容器类,例如二叉树啊,堆啊等等,我完全不知道里面数据如何存储的,但是我就是想要访问里面的数据,那么迭代器就完美的解决了这个问题。无论内部实现多么的复杂,我都可以访问内部数据。

其优缺点也比较明显,优点的话,无需了解集合的内部实现,即可遍历集合元素;缺点就是对于一些简单的集合,使用迭代器,显得有些多余。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值