设计模式-行为型-迭代器模式

97 阅读1分钟

简介

迭代器模式是行为型模式的一种,其作用是提供一种方法对一个对象中的元素进行顺序访问而又不暴露对象的内部结构。在Java中,迭代器有很成熟的应用,就是Iterator接口,我们可以用其访问Collection中的元素。接下来以一个简易版的Iterator来遍历Collection进行代码演示。

Demo示例

1.定义一个Iterator接口,然后MyIterator实现它

public interface Iterator {
    boolean hasNext();
    Object getNext();
}
import java.util.List;

public class MyIterator implements Iterator{

    private List<String> list;
    private int currentIndex;

    public MyIterator(List<String> list) {
        currentIndex = 0;
        this.list = list;
    }

    @Override
    public boolean hasNext() {
        return currentIndex <= list.size() - 1;
    }

    @Override
    public String getNext() {
        if (!hasNext()) {
            return null;
        }
        return list.get(currentIndex++);
    }
}

2.定义一个Connectionn接口,然后MyCollection实现它:

public interface Collectionn {
    void add(String ele);
    void remove(String ele);
    Iterator iterator();
}
import java.util.ArrayList;
import java.util.List;

public class MyCollection implements Collectionn{

    private List<String> list;

    public MyCollection() {
        list = new ArrayList<>();
    }

    @Override
    public void add(String ele) {
        list.add(ele);
    }

    @Override
    public void remove(String ele) {
        list.remove(ele);
    }

    @Override
    public Iterator iterator() {
        return new MyIterator(list);
    }
}

3.客户端调用

public class Test {
    public static void main(String[] args) {
        Collectionn collectionn = new MyCollection();
        collectionn.add("james");
        collectionn.add("jordan");
        collectionn.add("kobe");
        collectionn.add("unknown");
        Iterator myIterator = collectionn.iterator();
        while (myIterator.hasNext()){
            System.out.println(myIterator.getNext());
        }
        /**
         * james
         * jordan
         * kobe
         * unknown
         */
        collectionn.remove("unknown");
        myIterator = collectionn.iterator();
        while (myIterator.hasNext()){
            System.out.println(myIterator.getNext());
        }
        /**
         * james
         * jordan
         * kobe
         */
    }
}