一、迭代器模式
1、定义
迭代器模式(Iterator Pattern)又称作游标模式(Cursor Pattern)
,它提供一种按顺序访问集合/聚合/容器对象元素的方法,而又无须暴露集合内部表示。迭代器模式可以为不同的容器提供一致的遍历行为,而不用关心容器内元素的组成结构,属于行为型设计模式。
迭代器模式的本质是把集合对象的迭代行为抽象到迭代器中,提供一致的接口。
2、结构
(1)模式的结构
主要角色如下:
- 抽象迭代器(Iterator):负责定义访问和遍历
元素
的接口。 - 具体迭代器(ConcreteIterator):提供具体的元素遍历方法。
- 抽象容器(IAggregate):负责定义提供
具体迭代器
的接口。 - 具体容器(ConcreteAggregate):创建具体迭代器。
3、优缺点
优点:
- 多态迭代:为不同的聚合结构提供一致的接口,即一个迭代接口可以访问不同的集合对象。
- 简化集合对象接口。
- 元素迭代功能多样化:每个集合对象都可以提供一个或者多个不同的迭代器。
- 解耦迭代与集合。
缺点:
- 对于简单的遍历,使用它较为烦琐。
- 在日常开发中,我们几乎不会自己写迭代器。开源框架提供的 API完全够用。
4、使用场景
- 访问一个集合对象的内容而无须暴露它的内部表示。
- 为遍历不同的集合结构提供一个统一的访问接口。
- 当你需要对集合有多种方式的遍历时,可以考虑。
5、在框架源码中使用
- Java中的 Iterator源码。
- Mybatis中的 DefaultCursor类。
二、模式的通用实现
代码如下:
public class IteratorPattern {public static void main(String[] args) {// 创建容器对象IAggregate<String> aggregate = new ConcreteAggregateA<>();aggregate.add("赵云");aggregate.add("张飞");aggregate.add("刘备");// 获取容器对象的迭代器Iterator<String> iterator = aggregate.iterator();while (iterator.hasNext()) {String element = iterator.next();System.out.println(element);}}
}// 抽象迭代器
interface Iterator<E> {E next();boolean hasNext();
}// 具体迭代器
class ConcreteIteratorA<E> implements Iterator<E> {private List<E> list;private int cursor = 0;public ConcreteIteratorA(List<E> list) {this.list = list;}@Overridepublic E next() {return this.list.get(this.cursor++);}@Overridepublic boolean hasNext() {return this.cursor < this.list.size();}
}// 抽象容器
interface IAggregate<E> {boolean add(E element);boolean remove(E element);// 遍历方法Iterator<E> iterator();
}// 具体容器
class ConcreteAggregateA<E> implements IAggregate<E> {private List<E> list = new ArrayList<>();@Overridepublic boolean add(E element) {return this.list.add(element);}@Overridepublic boolean remove(E element) {throw new UnsupportedOperationException("不支持迭代删除");}@Overridepublic Iterator<E> iterator() {return new ConcreteIteratorA<>(this.list);}
}
三、模式的应用实例
以遍历王者英雄为例,你也可以在添加一个迭代器(中文升序遍历)。
@Data
@AllArgsConstructor
@ToString
public class Hero {private String name;}
(1)迭代器
public interface HeroIterator<E> {E next();boolean hasNext();
}public class HeroIteratorImpl<E> implements HeroIterator<E> {private List<E> list;private int cursor = 0;public HeroIteratorImpl(List<E> list) {this.list = list;}@Overridepublic E next() {return this.list.get(this.cursor++);}@Overridepublic boolean hasNext() {return this.cursor < this.list.size();}
}
(2)容器
public interface HeroAggregate<E> {boolean add(E element);boolean remove(E element);// 遍历方法HeroIterator<E> iterator();
}public class HeroAggregateImpl<E> implements HeroAggregate<E> {private List<E> list;public HeroAggregateImpl() {this.list = new ArrayList<>();}@Overridepublic boolean add(E element) {return this.list.add(element);}@Overridepublic boolean remove(E element) {throw new UnsupportedOperationException("不支持迭代删除");}@Overridepublic HeroIterator<E> iterator() {return new HeroIteratorImpl<>(this.list);}
}
(3)测试
public static void main(String[] args) {// 创建容器对象HeroAggregate<Hero> aggregate = new HeroAggregateImpl<>();aggregate.add(new Hero("赵子龙"));aggregate.add(new Hero("张翼德"));aggregate.add(new Hero("刘玄德"));// 获取容器对象的迭代器HeroIterator<Hero> iterator = aggregate.iterator();while (iterator.hasNext()) {Hero hero = iterator.next();System.out.println(hero);}}
– 求知若饥,虚心若愚。