设计模式---迭代器(Iterator)模式

1. 什么是迭代器模式?

迭代器模式,提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。
迭代器模式的本质是将遍历聚合对象中数据的行为提取出来,封装到一个迭代器中,通过专门的迭代器来遍历聚合对象的内部数据。

2. 迭代器用来做什么?

用于在数据集合中按照顺序遍历集合。

3. 迭代器模式中的角色

在这里插入图片描述

  • Iterator(迭代器)
    一般是一个接口,负责定义遍历元素的方法。
  • ConcreteIterator(具体迭代器)
    负责实现Iterator角色所定义的方法,完成集合的迭代。
  • Aggregate(集合)
    一般是一个接口,提供一个iterator()方法,用来创建Iterator。
  • ConcreteAggregate(具体集合)
    就是抽象集合Aggregate的具体实现类,它会创建出具体的Iterator,即ConcreteIterator。
4. 示例代码

为了方便理解,写一段代码简单演示一下迭代器模式。这段代码是模拟停车场,主要是将车停进停车场,并将车牌号按顺序显示出来。简单演示功能,请不要过于在意代码的细节。

Iterator接口
/**
 * 对应类图中的Iterator角色
 * 用于遍历集合中的元素,其作用就相当于循环语句中的循环变量。
 * 主要有两个方法:
 * hasNext()判断集合是否存在下一个元素;
 * next()获取下一个元素。
 */
public interface Iterator {

    boolean hasNext();

    Object next();
}
Aggregate接口
/**
 * 对应类图中的Aggregate角色
 * 主要负责创建Iterator
 */
public interface Aggregate {

    Iterator iterator();
}

接口中只声明了一个方法,该方法会生成一个用于遍历集合的迭代器。

Car类
/**
 * 汽车类
 */
public class Car {

    private String no;

    public Car(String no) {
        this.no = no;
    }

    public String getNo() {
        return no;
    }
}

Car类表示汽车的类。作用有限,只是通过getNo方法来获取车牌号。

Park类
**
 * 停车场类
 * 对应类图中的ConcreteAggregate角色。
 */
public class Park implements Aggregate {
    // 汽车数组
    private Car[] cars;
    // 下标
    private int index;

    /**
     * 初始化对象的时候指定数组的最大长度
     *
     * @param maxSize
     */
    public Park(int maxSize) {
        this.cars = new Car[maxSize];
        this.index = 0;
    }

    /**
     * 获取对应位置的Car
     *
     * @param index
     * @return
     */
    public Car getCarAt(int index) {
        return cars[index];
    }

    /**
     * 获取数组长度
     *
     * @return
     */
    public int getSize() {
        return index;
    }

    /**
     * 添加车到停车场中
     *
     * @param car
     */
    public void parkTheCar(Car car) {
        cars[index++] = car;
    }

    @Override
    public Iterator iterator() {
        return new ParkIterator(this);
    }
}

Park类表示停车场类。由于需要将它当做集合来处理,所有实现了Aggregate接口,就相当与类图中的ConcreteAggregate类。
它实现了iterator方法,该方法返回了ParkIterator类的实例。当外部想要遍历这个停车场时,就会调用这个方法。

ParkIterator类
/**
 * 具体的迭代器
 * 相当于类图中的ConcreteIterator
 */
public class ParkIterator implements Iterator {

    // 需要遍历的停车场
    private Park park;

    private int index;

    public ParkIterator(Park park) {
        this.park = park;
        this.index = 0;
    }

    @Override
    public boolean hasNext() {
        return index < park.getSize();
    }

    @Override
    public Object next() {
        Car car = park.getCarAt(index);
        index++;
        return car;
    }
}
Test类
public class Test {

    public static void main(String[] args) {
        Park park = new Park(3);

        park.parkTheCar(new Car("京A11111"));
        park.parkTheCar(new Car("沪A22222"));
        park.parkTheCar(new Car("辽B33333"));

        Iterator it = park.iterator();
        while (it.hasNext()) {
            Car car = (Car) it.next();
            System.out.println(car.getNo());
        }
    }
}

这段代码首先生成了一个能容纳3辆车的停车场,然后按顺序停入3辆车。
通过park.iterator()得到的it就是用于遍历停车场的迭代器。
代码运行的结果如下:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值