欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

大话设计模式笔记(十七)の迭代器模式

程序员文章站 2022-12-21 10:00:12
迭代器模式 定义 提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。 什么时候用? 当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,你就应该考虑用迭代器模式 。 你需要对聚集有多种方式遍历时,可以考虑用迭代器模式。 UML图 模板代码 Aggregate It ......

迭代器模式

定义

提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。

什么时候用?

  • 当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,你就应该考虑用迭代器模式
  • 你需要对聚集有多种方式遍历时,可以考虑用迭代器模式。

uml图

大话设计模式笔记(十七)の迭代器模式

模板代码

aggregate

/**
 * 聚集抽象类
 * created by callmedevil on 2019/8/17.
 */
public abstract class aggregate {
    // 创建迭代器
    public abstract iterator createiterator();
}

iterator

/**
 * 迭代器抽象类
 * created by callmedevil on 2019/8/17.
 */
public abstract class iterator {
    // 用于定义得到开始对象、得到下一对象、判断是否到结尾、当前对象等抽象方法
    public abstract object first();
    public abstract object next();
    public abstract boolean isdone();
    public abstract object currentitem();
}

concreteaggregate

/**
 * 具体聚集类
 * created by callmedevil on 2019/8/17.
 */
public class concreteaggregate extends aggregate {

    // 存放聚合对象
    private list<object> items = new arraylist();

    @override
    public iterator createiterator() {
        return new concreteiterator(this);
    }

    // 返回聚集的总个数
    public int count() {
        return items.size();
    }

    // 声明一个索引器
    public object get(int index) {
        return items.get(index);
    }
    public boolean set(object o) {
        return items.add(o);
    }

}

concreteiterator

/**
 * 具体迭代器类
 * created by callmedevil on 2019/8/17.
 */
public class concreteiterator extends iterator {

    // 定义一个具体聚集对象
    private concreteaggregate aggregate;
    private int current = 0;

    public concreteiterator(concreteaggregate aggregate){
        // 初始化时将具体的聚集对象传入
        this.aggregate = aggregate;
    }

    @override
    public object first() {
        // 得到聚集的第一个对象
        return aggregate.get(0);
    }

    @override
    public object next() {
        object ret = null;
        current++;
        if (current < aggregate.count()) {
            // 得到聚集的下一个对象
            ret = aggregate.get(current);
        }
        return ret;
    }

    @override
    public boolean isdone() {
        // 判断当前是否遍历到结尾
        return current >= aggregate.count();
    }

    @override
    public object currentitem() {
        // 返回当前的聚集对象
        return aggregate.get(current);
    }

}

测试

public class test {
    public static void main(string[] args) {
        // 公交车聚集对象
        concreteaggregate a = new concreteaggregate();
        // 新上来的乘客
        a.set("路飞");
        a.set("鸣人");
        a.set("一护");
        a.set("悟空");
        a.set("纳兹");
        a.set("琦玉");
        // 售票员登场,看好上车的是哪些人,即声明迭代器对象
        iterator i = new concreteiterator(a);
        system.out.println(string.format("车位no.1乘客:%s", i.first()));
        while (!i.isdone()){
            system.out.println(string.format("%s 来不及解释了,快上车!", i.currentitem()));
            i.next();
        }
    }
}

测试结果

车位no.1乘客:路飞
路飞 来不及解释了,快上车!
鸣人 来不及解释了,快上车!
一护 来不及解释了,快上车!
悟空 来不及解释了,快上车!
纳兹 来不及解释了,快上车!
琦玉 来不及解释了,快上车!

倒序遍历

concreteiteratordesc

/**
 * 倒序具体迭代器
 * created by callmedevil on 2019/8/17.
 */
public class concreteiteratordesc extends iterator{

    // 定义一个具体聚集对象
    private concreteaggregate aggregate;
    private int current = 0;

    public concreteiteratordesc(concreteaggregate aggregate){
        // 初始化时将具体的聚集对象传入
        this.aggregate = aggregate;
        current = aggregate.count() - 1;  //不同1
    }

    @override
    public object first() {
        // 得到聚集的第一个对象
        return aggregate.get(aggregate.count() - 1); //不同2
    }

    @override
    public object next() {
        object ret = null;
        current--;  //不同3
        if (current >= 0) {  //不同4
            // 得到聚集的下一个对象
            ret = aggregate.get(current);
        }
        return ret;
    }

    @override
    public boolean isdone() {
        // 判断当前是否遍历到结尾
        return current < 0;  //不同5
    }

    @override
    public object currentitem() {
        // 返回当前的聚集对象
        return aggregate.get(current);
    }

}

测试

将顺序测试类中声明迭代器具体对象改为倒序的 concreteiteratordesc 即可。

测试结果

车位no.1乘客:琦玉
琦玉 来不及解释了,快上车!
纳兹 来不及解释了,快上车!
悟空 来不及解释了,快上车!
一护 来不及解释了,快上车!
鸣人 来不及解释了,快上车!
路飞 来不及解释了,快上车!

总结

迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可以让外部代码透明的访问集合内部的数据。