0. 前言
写在最前面,本人的设计模式类博文,建议先看博文前半部分的理论介绍,再看后半部分的实例分析,最后再返回来复习一遍理论介绍,这时候你就会发现我在重点处标红的用心,对于帮助你理解设计模式有奇效哦~
1. 迭代器模式模式介绍
迭代器模式定义:
又叫做游标(Cursor)模式,提供一种方法访问一个容器(Container)对象中各个元素,而又不需暴露该对象的内部细节。
迭代器模式的使用场景:
JDK 1.2开始支持迭代器,每一个迭代器提供next()以及hasNext()方法。集合Collection只要实现了Iterable接口,我们都可以使用Iterator来遍历里面的元素。迭代器模式用于遍历一个容器对象时。
迭代器模式包括的角色:
(1)迭代器接口Iterator:该接口用于定义迭代功能的方法,比如提供hasNext()和next()方法。
(2)迭代器实现类Concrete Iterator:迭代器接口Iterator的实现类
(3)容器接口Aggregate:定义基本的增删功能以及类似Iterator iterator()的方法。
(4)容器实现类Concrete Aggregate:容器接口的实现类。
2. 实例介绍
按照上述的角色类,实现一个简单的迭代器模式。
//迭代器接口 public interface Interator<T>{ boolean hasNext(); T next(); } //具体实现类 public class ConcreteInterator<T> implements Interator<T>{ private List<T> list = new ArrayList<T>(); int count = 0; public ConcreteInterator( List<T> list){ this.list = list; } @override public boolean hasNext (){ return count!=list.size(); } @override public T next(){ return list.get(count++); } } //容器抽象类 public interface Aggregate<T>{ void add(T obj); void remove(T obj); Interator<T> iterator(); } //具体容器实现类 public class Concrete Aggregate<T> implements Aggregate<T>{ private List<T> list = new ArrayList<T>(); @override public T add(T obj){ list.add(obj); } @override public T remove(T obj){ list.remove(obj); } @override public Interator<T> iterator(){ return new ConcreteInterator<T>(list); } } //使用时 Aggregate<String> aggregate = new ConcreteAggregate<>(); aggreagte.add(“SEU”); aggreagte.add(“Calvin”); Inteator<String> i = aggregate.iterator(); if(i.hasNext()){ System.out.println(i.next()); }
3. 迭代器模式优缺点和总结
迭代器模式的优点:
(1)支持以不同的方式去遍历一个容器对象。
(2)弱化了遍历算法和容器类中间的关系,因此可以支持多个遍历同时进行。
迭代器模式的缺点:
类的个数成对增加,这在一定程度上增加了系统的复杂性。
最后需要注意的是,各种高级编程语言都会有自己的内置容器以及迭代器模式的内部实现。
因此开发者对迭代器模式只需要了解即可,一般不需要自己实现、应用。