本文一起看下一种行为型设计模式,迭代器模式。
当对象的内部有一批数据,希望能够对外暴露访问,但因为如下的原因不希望外部直接访问内部的具体存储数据的元素:
1:内部元素具体是什么结构是不稳定的,可能会随时改变,改变后,之前的客户端代码将不可用
2:内部元素直接暴露可能会引起数据的安全问题,外部有意或者是无疑的数据修改,会引起不可预知的bug
此时,就可以考虑使用迭代器设计模式。
原型设计模式,包含如下元素:
1:Iterable
可迭代接口,定义了可以获取数据的迭代器
2:Iterator
迭代器接口,定义了具体迭代获取数据的方法
4:客户端
通过迭代器获取数据
源码 。
记得大学时,总是时常会逃课,在寝室聊大天,睡大觉,但,一旦,好基友发来消息:“老师点名了!!!”,此时的我们,用百米冲刺的速度冲向教师,现在想起来只有一个感觉“累,是真的累到喘不过气”。今天,我们就以老师点名
为场景来共同学习迭代器设计模式,也以此来缅怀美好的大学时光,缅怀逝去的被挥霍的青春!!!
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);
}
@Override
public MyIterator<Student> iterator() {
return new Itr();
}
private class Itr implements MyIterator<Student> {
int index = 0;
@Override
public boolean hasNext() {
if (index < students.size()) {
return true;
}
return false;
}
@Override
public Student next() {
Student student = students.get(index);
index++;
return student;
}
}
}
@Test
public void checkAttendance(){
Classs cls= new Classs();
System.out.println("--------------开始点名--------------");
// Iterator 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) 。