设计模式入门:迭代器模式

来源:互联网 发布:螺旋打印二维数组 编辑:程序博客网 时间:2024/05/21 16:06
很长时间没写博客,因为学了一门慕课网的实战课程。全慕课网规模最大的实战课程(就是那个IM项目)。因为实在是太难了,而且规模巨大,加上最近要期末考试……好了,期末基本考完了,继续学习IM。空闲时间看一下设计模式。今天开始入门设计模式:迭代器模式。
(迭代器本身是翻译的问题,如果从字面半身来看,应该是叫“重复的做某一件事”。没错,迭代可以说就是循环的别称)
下面用一个很简单的例子来说明迭代器的用途吧:比如我们要遍历一个班上所有的学生
首先我们创建一个学生类,然后创建一个学生集合,然后遍历这个集合。
稍微写一下代码(一会 就在这个代码基础上修改嘛):
public class Student {    private String name;    public Student(String name) {        this.name = name;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}
然后在Main类里面遍历就可以了
public class Main {    public static void main(String[] args){        List<Student>students=new ArrayList<>();        for(int i=0;i<5;i++){            students.add(new Student("student"+i));            System.out.println(students.get(i).getName());        }
    }}
这是最简单的迭代器的使用,不夸张的说,一个刚刚入门java的大一新生都是这样写的。下面讲一下用了迭代器模式的写法。
第一步:定义迭代器
public interface Iterator {    public abstract boolean hasNext();    public abstract Object next();}
迭代器里面只有两个方法,先判断这个学生后面还有没有学生。如果有就继续,没有就结束。当然,这两个方法在这里还没写。
第二步:定义接口的集合
public interface Aggregate {    public abstract Iterator iterator();}
在这里使用迭代器模式只需要使用一个方法就可以了。
第三步:创建Student类
其实就是上面的student类,不需要改变
public class Student {    private String name;    public Student(String name) {        this.name = name;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}
第四步:创建班级
public class StudentClass implements Aggregate{    private List<Student>students=new ArrayList<>();    //添加一个学生    public void addStudent(Student student){        students.add(student);    }    //获取班级人数    public int getLength(){        return students.size();    }    //按照下标获取学生    public Student getStudent(int position){        return students.get(position);    }    //迭代器    public Iterator iterator(){        return new StudentClassIterator(this);    }}
班级其实就是学生的集合,同时要有迭代器
第五部:当然是写用来遍历班级的类了
public class StudentClassIterator implements Iterator{    private StudentClass studentClass;    private int index;    public StudentClassIterator(StudentClass studentClass) {        this.studentClass = studentClass;        this.index=0;    }    @Override    public boolean hasNext() {        if(index<studentClass.getLength())            return true;        else            return false;    }    @Override    public Object next() {        Student student=studentClass.getStudent(index);        index++;        return student;    }}
很简单,基本上一看就知道。index是下标,构造函数传入一个“班级”就可以。如果下标小于班级人数就继续,否则就结束。next方法的作用就是下标增加同时获取下标所指的学生。
最后一步:使用迭代器模式
public class Main {    public static void main(String[] args){        StudentClass studentClass=new StudentClass();        for(int i=0;i<5;i++){            studentClass.addStudent(new Student("student"+i));        }        Iterator iterator=studentClass.iterator();        while (iterator.hasNext()){            Student student= (Student) iterator.next();            System.out.println(student.getName());        }    }}
这种设计模式的步骤相对于实现的功能来说十分繁琐。但是确实是很有必要的。
我们编写的代码不仅仅是给自己用的,更多的时候需要合作才可以,我们的代码要尽可能做到低耦合!
我个人对低耦合的理解就是:尽量不要依赖具体的类来解决问题
在这里,完成遍历并没有调用studentClass的方法,所以说,迭代器的hasNext和Next方法就没有依赖studentclass的实现。

原创粉丝点击