写在前面
本文一起看下一种行为型设计模式,迭代器模式。
1:介绍
1.1:什么时候使用迭代器设计模式
当对象的内部有一批数据,希望能够对外暴露访问,但因为如下的原因不希望外部直接访问内部的具体存储数据的元素:
1:内部元素具体是什么结构是不稳定的,可能会随时改变,改变后,之前的客户端代码将不可用
2:内部元素直接暴露可能会引起数据的安全问题,外部有意或者是无疑的数据修改,会引起不可预知的bug
此时,就可以考虑使用迭代器设计模式。
1.2:UML类图
原型设计模式,包含如下元素:
1:Iterable可迭代接口,定义了可以获取数据的迭代器
2:Iterator迭代器接口,定义了具体迭代获取数据的方法
4:客户端通过迭代器获取数据
2:实例
源码 。
2.1:场景
记得大学时,总是时常会逃课,在寝室聊大天,睡大觉,但,一旦,好基友发来消息:“老师点名了!!!”,此时的我们,用百米冲刺的速度冲向教师,现在想起来只有一个感觉“累,是真的累到喘不过气”。今天,我们就以老师点名
为场景来共同学习迭代器设计模式,也以此来缅怀美好的大学时光,缅怀逝去的被挥霍的青春!!!
2.2:程序
- 可迭代接口
该接口说明该类是可被迭代的,可以通过某方法获取一个迭代器:
public interface MyIterable<T> {MyIterator <T> iterator();
}
通过iterator方法获取了迭代器MyIterator,下面来定义。
- 迭代器
public interface MyIterator<T> {boolean hasNext();T next();
}
- 定义学生
@AllArgsConstructor
@ToString
public class Student {private String name;private int age;
}
- 定义课堂
/public class Classs implements Iterable<Student> {
public class Classs implements MyIterable<Student> {private final List<Student> students = new ArrayList<>();public Classs() {students.add(new Student("王二狗", 28));students.add(new Student("牛翠花", 20));students.add(new Student("林蛋大", 29));}public boolean addStudent(Student student){return students.add(student);}public boolean removeStudent(Student student){return students.remove(student);}@Overridepublic MyIterator<Student> iterator() {return new Itr();}private class Itr implements MyIterator<Student> {int index = 0;@Overridepublic boolean hasNext() {if (index < students.size()) {return true;}return false;}@Overridepublic Student next() {Student student = students.get(index);index++;return student;}}
}
- 测试
@Test
public void checkAttendance(){Classs cls= new Classs();System.out.println("--------------开始点名--------------");
// Iterator<Student> iterator= cls.iterator();MyIterator<Student> iterator= cls.iterator();while (iterator.hasNext()){System.out.println(iterator.next());}
}
输出:
--------------开始点名--------------
Student(name=王二狗, age=28)
Student(name=牛翠花, age=20)
Student(name=林蛋大, age=29)Process finished with exit code 0
写在后面
其实迭代器设计模式在jdk中已经提供了实现,并得到了广泛的应用,其中的可迭代接口是java.lang.Iterable
,迭代器接口是java.util.Iterator
,我们肯定经常写如下的代码:
List list = new ArrayList();
Iterator it = list.iterator();
while(it.hasNext()){System.out.println(it.next());
}
其实就是在使用迭代器设计模式。所以,如果是工作中真的需要迭代器设计模式来解决问题,可迭代接口和迭代器接口是不需要自己定义的,直接使用jdk定义的就行了,因为使用jdk定义,还能带来额外的好处,比如可以使用增强for循环等。
参考文章列表
秒懂设计模式之迭代器模式(Iterator Pattern) 。