【设计模式】十七.行为型模式之迭代器模式

迭代器模式

一. 说明

迭代器模式主要用于迭代访问集合对象中的元素,而不用知道元素内部的结构状态。迭代器模式是属于行为型模式的一种。

迭代器模式在编程语言中使用较多,它的优点是可以用相同的方式,遍历不同的数据结构集合。在java中有许多集合都已经实现了这种模式,类似List, Set, Map等实现了Iterator接口的集合类,通过Iterator接口遍历的方式都是一样的,我们通过while-true在遍历集合时,通过Iterator.hasNext()判断是否存在下一个元素,通过Iterator.next()获取下一个元素。

二.应用场景

  1. 遍历集合的场景,集合可以是各种数据结构构成的
  2. 为不同的集合遍历提供相同的遍历方式时可以使用

三.代码示例

我们以通讯录为例,实现java的Iterator接口来让通讯录具有遍历功能

先创建一个集合接口,它继承自Iterator接口,具有添加、删除名片和获取迭代器的功能

public interface Collection<T> extends Iterator<T> {
    Iterator<T> getIterator();
    boolean add(T t);
    boolean remove(T t);
}

再创建一个名片实体类, 和通讯录集,通讯录集就是集合的实现类

@Data
public class NameCard {
    private String name;
    private int age;
    private String job;
    private String company;
    private String mobile;
}

public class AddressBook implements Collection<NameCard> {

    private NameCard[] cards = null;
    private int index;

    @Override
    public Iterator<NameCard> getIterator() {
        index = 0;
        return this;
    }

    @Override
    public boolean add(NameCard nameCard) {
        if (cards == null) {
            cards = new NameCard[]{nameCard};
        } else {
            NameCard[] temp = new NameCard[cards.length + 1];
            System.arraycopy(cards, 0, temp, 0, cards.length);
            temp[temp.length - 1] = nameCard;
            cards = temp;
        }
        return true;
    }

    @Override
    public boolean remove(NameCard nameCard) {
        NameCard[] temp = new NameCard[cards.length - 1];
        int j = 0;
        for (int i = 0; i < cards.length; i++) {
            if (cards[i] != nameCard) {
                temp[j] = cards[i];
                j++;
            }
        }
        cards = temp;
        return true;
    }

    @Override
    public boolean hasNext() {
        return index < cards.length;
    }

    @Override
    public NameCard next() {
        if (hasNext()) {
            return cards[index++];
        }
        return null;
    }
}

编写测试代码

public static void main(String[] args) {
        NameCard card1 = new NameCard();
        card1.setName("张三");
        card1.setAge(20);
        card1.setJob("销售");
        card1.setCompany("A公司");
        card1.setMobile("00000001");

        NameCard card2 = new NameCard();
        card2.setName("李四");
        card2.setAge(22);
        card2.setJob("行政");
        card2.setCompany("B公司");
        card2.setMobile("111111111");

        NameCard card3 = new NameCard();
        card3.setName("王五");
        card3.setAge(25);
        card3.setJob("后勤");
        card3.setCompany("C公司");
        card3.setMobile("22222222");

        AddressBook addressBook = new AddressBook();
        addressBook.add(card1);
        addressBook.add(card2);
        addressBook.add(card3);

        Iterator<NameCard> iterator = addressBook.getIterator();
        while (iterator.hasNext()) {
            NameCard card = iterator.next();
            System.out.println(card);
        }
        System.out.println("------------------------");
        addressBook.remove(card2);
        Iterator<NameCard> iterator1 = addressBook.getIterator();
        while (iterator1.hasNext()) {
            NameCard card = iterator1.next();
            System.out.println(card);
        }

    }

结果输出如下
【设计模式】十七.行为型模式之迭代器模式_第1张图片
我们利用Java实现的迭代器模式的Iterator接口,实现了像List一样的遍历功能,但这个案例中没有考虑List集合中的一些优化点,诸如数组扩容等。

四. 总结

迭代器模式满足了单一职责和开放封闭原则,外界调用无需关心不同数据结构在使用上的差异,它们的使用方式都是一致的。

你可能感兴趣的:(java设计模式,设计模式,迭代器模式,java)