应用场景
- 在现实生活以及程序设计中,经常要访问一个聚合对象中的各个元素,如“数据结构”中的链表遍历,通常的做法是将链表的创建和遍历都放在同一个类中,但这种方式不利于程序的扩展,如果要更换遍历方法就必须修改程序源代码,这违背了 “开闭原则”。
- 既然将遍历方法封装在聚合类中不可取,那么聚合类中不提供遍历方法,将遍历方法由用户自己实现是否可行呢?答案是同样不可取,因为这种方式会存在两个缺点:
- 暴露了聚合类的内部表示,使其数据不安全;
- 增加了客户的负担。
优点
- “迭代器模式”能较好地克服以上缺点,它在客户访问类与聚合类之间插入一个迭代器,这分离了聚合对象与其遍历行为,对客户也隐藏了其内部细节,且满足“单一职责原则”和“开闭原则”,如 Java 中的 Collection、List、Set、Map 等都包含了迭代器。
- 迭代器模式在生活中应用的比较广泛,比如:物流系统中的传送带,不管传送的是什么物品,都会被打包成一个个箱子,并且有一个统一的二维码。这样我们不需要关心箱子里是什么,在分发时只需要一个个检查发送的目的地即可。再比如,我们平时乘坐交通工具,都是统一刷卡或者刷脸进站,而不需要关心是男性还是女性、是残疾人还是正常人等信息。
主要组件
- 抽象聚合(Aggregate)角色:定义存储、添加、删除聚合对象以及创建迭代器对象的接口。
- 具体聚合(ConcreteAggregate)角色:实现抽象聚合类,返回一个具体迭代器的实例。
- 抽象迭代器(Iterator)角色:定义访问和遍历聚合元素的接口,通常包含 hasNext()、first()、next() 等方法。
- 具体迭代器(Concretelterator)角色:实现抽象迭代器接口中所定义的方法,完成对聚合对象的遍历,记录遍历的当前位置。
应用举例
UML图
样例代码
import java.util.ArrayList;
import java.util.List;
/**
* @program: DesignPatterns
* @description: 迭代器模式
* @author: TATE.LU
* @create: 2020-12-08 15:21
**/
public class IteratorPattern {
public static void main(String[] args){
University university=new ChinaUniversity();
UniversityObject student=new Student("小天");
UniversityObject academy=new Academy("计算机学院");
university.add(student);
university.add(academy);
Iterator iterator=university.getIterator();
while(iterator.hasNext()){
Object object=iterator.next();
System.out.println(object.toString());
}
}
}
interface Iterator{
Object first();
Object next();
boolean hasNext();
}
class ConcreteIterator implements Iterator{
private List<Object> list;
private int index=-1;
public ConcreteIterator(List<Object> list){
this.list=list;
}
public Object first() {
index=0;
return list.get(index);
}
public Object next() {
if(this.hasNext()){
this.index++;
return this.list.get(this.index);
}
return null;
}
public boolean hasNext() {
// 因为index指向当前访问的前一个元素,所以是list.size()-1
if(this.index<list.size()-1){
return true;
}
return false;
}
}
/*
* 抽象类和普通类的区别
* 1.抽象类不可以被实例化
* 2.抽象类的抽象方法,子类必须实现重写,除非子类也是抽象类
*
* */
abstract class UniversityObject{
protected String name;
public UniversityObject(String name){
this.name=name;
}
abstract void sayYourName();
}
class Student extends UniversityObject{
public Student(String name){
super(name);
}
void sayYourName() {
}
@Override
public String toString() {
return "学生的名字:"+this.name;
}
}
class Academy extends UniversityObject{
public Academy(String name){
super(name);
}
void sayYourName() {
}
@Override
public String toString() {
return "学院的名字:"+this.name;
}
}
interface University{
void add(Object object);
void remove(Object object);
Iterator getIterator();
}
class ChinaUniversity implements University{
List<Object> objectList=new ArrayList<Object>();
public void add(Object object) {
this.objectList.add(object);
}
public void remove(Object object) {
this.objectList.remove(object);
}
public Iterator getIterator() {
return new ConcreteIterator(this.objectList);
}
}
参考链接
C语言中文网
菜鸟教程