EchoDemo's Blogs

Java中的迭代模式举例

1、案例介绍

提供一种方法访问一个容器对象中各个元素,而又不需要暴露该对象的内部细节。自定义容器和迭代器。

2、案例设计

迭代器角色(Iterator)、具体迭代器角色(Concrete Iterator)、容器角色(Container)、具体容器角色(Concrete Container)。

定义具体的迭代器角色(我们可以取名为MyIterator)用来实现迭代器角色接口(如Iterator接口,在使用当中,其主要包含hasNext()方法和next()方法)。对于容器角色和具体的容器角色,可以比较直观地把List看作是容器角色,而把ArrayList看作是具体容器角色。

3、具体实现

(1)迭代器角色

package com.iotech.myiterator;

public interface Iterator<T> {
    public boolean hasNext();//判断是否有下一个元素
    public T next();//获取下一个元素的内容
}

(2)容器角色

package com.iotech.myiterator;

public interface List<T> {
    public void add(T obj);//给具体的容器添加元素
    public T get(int index);//获取指定位置上的元素
    public int size();//获得容器中的元素个数
    public Iterator<T> iterator();//得到具体的迭代器对象
}

(3)具体的迭代器角色

package com.iotech.myiterator;

public class MyIterator<T> implements Iterator<T> {

    private List list=null;
    private int index=0;//访问到容器中元素的当前下标

    //创建一个迭代器对象的时候接收要被迭代的具体的容器对象
    public MyIterator(List<T> list){
        this.list=list;
    }

    //判断是否有下一个元素
    @Override
    public boolean hasNext() {
        return index<list.size();
    }

    //取出下一个元素
    @SuppressWarnings("unchecked")
    @Override
    public T next() {
        return (T) list.get(index++);
    }
}

(4)具体的容器角色

package com.iotech.myiterator;

public class ArrayList<T> implements List<T> {

    private Object[] obj=null;//声明一个Object类型的数组(泛型是不能声明泛型数组的)
    private int index;//数组的下标
    private int size;//记录数组中元素的个数

    public ArrayList(){
        obj=new Object[10];
        index=0;
        size=0;
    }

    @Override
    public void add(T obj) {
        this.obj[index++]=obj;//把数据存放到数组中
        size++;//元素个数加1
    }

    @SuppressWarnings("unchecked")
    @Override
    public T get(int index) {
        return (T) this.obj[index];
    }

    @Override
    public int size() {
        return size;
    }

    @Override
    public Iterator<T> iterator() {
        return new MyIterator<T>(this);
    }
}

(5)测试类

package com.iotech.myiterator;

public class Test {

    public static void main(String[] args) {
        List<String> nameList=new ArrayList<String>();
        nameList.add("zhangsan");
        nameList.add("lisi");
        nameList.add("wangwu");
        nameList.add("chenhao");
        Iterator<String> iterator=nameList.iterator();
        while(iterator.hasNext()){
            System.out.println(iterator.next());
        }

    }
}
🐶 您的支持将鼓励我继续创作 🐶
-------------本文结束感谢您的阅读-------------