设计模式——迭代器模式

一、什么是迭代器模式?

 

  我们在Java中经常会遇到集合对象,这些集合对象内部有着各种各样的实现。如果我们去遍历集合中的数据,那么就需要各种各样的实现。迭代器模式就可以解决这种场景,它分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样就可以既不暴露集合内部的结构,又可以让外部程序访问集合内的数据。就像Collection集合类中有List和Set,要去访问他们内部的数据,我们只需要建立一个Iterator就可以了。


  迭代器模式涉及到以下几个角色:


  1. 抽象迭代器角色:定义访问和遍历元素的接口

  2. 具体迭代器角色:实现了迭代器接口并记录当前遍历的索引

  3. 抽象容器(Container)角色: 负责提供创建具体迭代器角色的接口

  4. 具体容器角色:创建具体迭代器角色的接口

  5. 客户端:创建容器

 

 

二、迭代器模式框图

 




 

三、迭代器模式的具体实现代码

 

  来举个例子,果农在山上种果树,本来山上是没有树的,现在要种几棵果树,然后遍历所有的数。

 

3.1 interface——抽象迭代器

package designpatterns.iterator;

/**
 * Created by Olive on 2017/12/28.
 * 抽象迭代器接口
 */
public interface Iterator {
    boolean hasNext();
    Object next();
}

3.2 Tree——种的树

package designpatterns.iterator;

/**
 * Created by Olive on 2017/12/28.
 * 树
 */
public class Tree {

    private String name;

    public Tree(String name){
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

3.3 Mountain——山,容器类,内部有建立迭代器的方法

package designpatterns.iterator;

/**
 * Created by Olive on 2017/12/28.
 * 山,容器类,内部有建立迭代器的方法
 */
public class Mountain {

    Tree[] trees;
    private int index;

    public Mountain(int num){
        trees = new Tree[num];
        index = 0;
    }

    public void addTree(Tree tree){
        trees[index] = tree;
        index++;
    }

    public Iterator connectIterator(){
        return new TreeIterator(this);
    }
}

3.4 TreeIterator——树的迭代器,内部有容器对象的引用,并维护了一个索引

package designpatterns.iterator;

/**
 * Created by Olive on 2017/12/28.
 * 树的迭代器,内部有容器对象的引用,并维护了一个索引
 */
public class TreeIterator implements Iterator {

    private int last = 0;
    private Mountain mountain;

    public TreeIterator(Mountain mountain) {
        this.mountain = mountain;
    }

    public boolean hasNext() {
        if (last < mountain.trees.length) {
            return true;
        } else {
            return false;
        }
    }

    public Tree next() {
        Tree t = mountain.trees[last];
        last++;
        return t;
    }
}

3.5 Client——客户端

package designpatterns.iterator;

/**
 * Created by Olive on 2017/12/28.
 */
public class Client {

    public static void main(String[] args){

        Mountain mountain = new Mountain(4);
        mountain.addTree(new Tree("樱桃树"));
        mountain.addTree(new Tree("苹果树"));
        mountain.addTree(new Tree("柠檬树"));
        mountain.addTree(new Tree("橙子树"));

        for(Iterator i = mountain.connectIterator();i.hasNext();){
            String type = ((Tree) i.next()).getName();
            if(type.equals("樱桃树")){
                System.out.println("樱桃樱桃快长大!");
            }
            if(type.equals("苹果树")){
                System.out.println("苹果苹果快长大!");
            }
            if(type.equals("柠檬树")){
                System.out.println("柠檬柠檬快长大!");
            }
            if(type.equals("橙子树")){
                System.out.println("橙子橙子快长大!");
            }
        }
    }
}

3.6 结果

樱桃樱桃快长大!
苹果苹果快长大!
柠檬柠檬快长大!
橙子橙子快长大!

Process finished with exit code 0

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值