设计模式之迭代器模式

写在前面

本文一起看下一种行为型设计模式,迭代器模式。

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);
    }

    @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) 。

你可能感兴趣的:(设计模式,设计模式,迭代器模式)