Iterator 模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_30436087/article/details/80933502

1、概念

使用Java语言显示数组arr中的元素时,我们一般使用for循环语句遍历数组。

for(int i=0;i<arr.length;i++) {
    System.out.println(i);
}

那么将这里的循环变量i的作用抽象化、通用化后形成的模式,在设计模式中称为Iterator模式

Iterator模式用于在数据集合中按照顺序遍历集合。即为迭代器模式。

意图:提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。
这里写图片描述

由上图,知一个迭代器模式可由四个角色组成。

Iterator (迭代器) : 该角色负责定义按顺序逐个遍历元素的接口(API)。

ConcreteIterator (具体的迭代器) : 该角色负责实现Iterator角色所定义的接口(API)。

Aggregate (集合): 该角色负责定义创建Iterator角色的接口(API)。

ConcreteAggregate (具体的集合) : 该角色负责实现Aggregate角色所定义的接口(API)。它会创建具体的Iterator角色,即ConcreteIterator。

2、具体实现

/**
 * 迭代器接口
 */
public interface Iterator {
    public abstract boolean hasNext();

    public abstract Object  next();
}
/**用于生成迭代器的接口
 * 该接口中只有一个方法, 这个方法用于生成一个迭代器, 并返回
 * 如果某个集合想使用迭代器, 那么就应该实现这个接口
 */
public interface Aggregate {
    public abstract Iterator iterator();
}
/**
 * Cat是个体, 一个Cat实例代表一只猫.
 * CatGroup是Cat的集合, 一个CatGroup实例代表一群猫.
 */
public class Cat {
    private int age;
    private String name;

    public Cat(String name, int age) {
        this.age = age;
        this.name = name;
    }

    @Override
    public String toString() {
        return "Cat{" +
                "name='" + name + '\'' +
                ", age='" + age + '\'' +
                '}';
    }
}
/**
 * Cat是个体, 一个Cat实例代表一只猫.
 * CatGroup是Cat的集合, 一个CatGroup实例代表一群猫.
 *
 * 并且这个类实现了Aggregate的iterator()方法来获取迭代器
 */
public class CatGroup implements Aggregate {

    private int last;
    private Cat[] cats;

    public CatGroup(int maxsize) {
        this.cats = new Cat[maxsize];
    }

    public Cat getByIndex(int index) {
        return cats[index];
    }

    public void append(Cat cat) {
        cats[last++] = cat;
    }

    public int getLength() {
        return last;
    }

    @Override
    public Iterator iterator() {
        return new CatGroupIterator(this);
    }
}
//集合迭代器类
public class CatGroupIterator implements Iterator {
    private int index;
    private CatGroup catGroup;

    public CatGroupIterator(CatGroup catGroup) {
        this.catGroup = catGroup;
        this.index = 0;
    }

    @Override
    public boolean hasNext() {
        return index < catGroup.getLength();
    }

    @Override
    public Object next() {
        return catGroup.getByIndex(index++);
    }
}
//测试类
public class Main {
    public static void main(String[] args) {
        // 创建一个猫群
        CatGroup catGroup = new CatGroup(20);

        // 向猫群里添加猫
        catGroup.append(new Cat("betty", 10));
        catGroup.append(new Cat("nancy", 11));
        catGroup.append(new Cat("wood", 14));
        catGroup.append(new Cat("zira", 18));

        // 获取遍历该猫群的迭代器
        Iterator iterator = catGroup.iterator();

        // 迭代并输出
        while (iterator.hasNext()) {
            Cat c = (Cat) iterator.next();
            System.out.println(c);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/sinat_30436087/article/details/80933502