浅谈Iterator迭代器模式

1、前言编程

设计模式有不少,最典型的是GoF的23种设计模式,听起来不少,其实大部分咱们都是见过的,按照常见度来分,最经常使用的差很少是六七个吧,所以,咱们在学习的时候应该有轻重缓急之分,不能一视同仁,而应该抓住重点,将一些最经常使用的设计模式吃透了,那么咱们在遇到一个实际问题的时候就能根据问题的须要来进行相应的取舍。学习是一个循环往复的过程,没有学过一次再也不接触就能掌握的,必定要反复的记忆,反复的练习,不断地提炼,不断地提升,没有复习的学习就是参观,没有预习的学习就是作梦,没有提高的学习就是浪费时间。设计模式

2、迭代器模式app

什么叫作迭代器,咱们可能在C++的STL标准模板库或者在Java中见过iterator这个东西,所谓“迭代”就是按照必定的次序或顺序进行重复操做,这个操做能够是遍历也能够是反复的计算,而迭代器就是按照必定的顺序对元素进行遍历的过程。理解到这个程度,咱们可能很是的奇怪,由于咱们彻底可使用一个for循环来完成这样的操做,又何须大费周章的来一个迭代器来遍历呢?!这就涉及到软件设计中最重要的一个原则了,那就是高内聚,低耦合。当咱们使用for循环来完成遍历操做的时候代码中有着大量的耦合,当咱们须要修改代码的时候,不能作到少改甚至不改遍历的代码,而迭代器能够作到,这为代码的可移植性、可扩展性等特性奠基了基础。咱们能够看到设计模式大多数是把简单的问题给搞复杂了,可是这种复杂偏偏是为了之后设计和扩展的简单。正如没有规划的盖一座房子,很快就盖成了一座房子,但是由于没有考虑到房子的方位、地基、之后的扩展、居住的温馨,改出来的房子最后不能进行扩展而且不符协力学的美感和力感,最终只能从新拆掉重建,因此学习设计模式的时候最好看一些建筑方面的设计,明白全局观的重要性。废话少说,直接上代码(talk is cheap,let's show code!)ide

3、代码函数

package designMode.iterator;

public class Book {
    String name;

    public Book(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
package designMode.iterator;

public interface Aggregate {
    public abstract Iterator iterator();
}
package designMode.iterator;

public class BookShelf implements Aggregate{
    Book[] books;
    int pointer = 0;
    public BookShelf(int max_size){
        books = new Book[max_size];
    }
    public void appendBook(Book book){
        books[pointer] = book;
        pointer++;
    }

    public Book findBookAt(int index){
        return books[index];
    }

    public int getLength(){
        return pointer;
    }

    public Iterator iterator() {
        return new BookShelfIterator(this);
    }
}
package designMode.iterator;

public interface Iterator {
    public abstract boolean hasNext();
    public abstract Object next();
}
package designMode.iterator;

public class BookShelfIterator implements Iterator {
    BookShelf bookShelf;
    int index;

    public BookShelfIterator(BookShelf bookShelf) {
        this.bookShelf = bookShelf;
        index = 0;
    }

    @Override
    public boolean hasNext() {
        if(index<this.bookShelf.getLength()){
            return true;
        }
        return false;
    }

    @Override
    public Object next() {
        return bookShelf.findBookAt(index++);
    }
}
package designMode.iterator;

public class IteratorMain {
    public static void main(String[] args) {
        Book book1 = new Book("宫本武藏");
        Book book2 = new Book("孙悟空");
        Book book3 = new Book("诸葛亮");
        Book book4 = new Book("黄忠");
        Book book5 = new Book("蔡文姬");

        BookShelf bookShelf = new BookShelf(5);
        bookShelf.appendBook(book1);
        bookShelf.appendBook(book2);
        bookShelf.appendBook(book3);
        bookShelf.appendBook(book4);
        bookShelf.appendBook(book5);

        Iterator it = bookShelf.iterator();
        while (it.hasNext()){
            Book book = (Book) it.next();
            System.out.println("你选择的英雄是:"+book.getName());
        }
    }
}

 

4、分析工具

在上面咱们的程序中,有着不少值得说明的地方,首先是类、接口的结构,咱们可使用下面的图来表达,从图中咱们能够看出,最核心的两个对象,一个是书架这样的一个书的集合books[],表明了须要遍历的元素;另外一个就是迭代器,好像一个工具,用到的时候将this对象代指的书架集合放里面,进行遍历,不须要的时候束之高阁。同时为何会有接口呢,其实接口的做用是为了下降耦合度,在main函数中,咱们使用的是iterator这个接口来定义的引用,而不是BookShelfIterator,这样作的好处是彻底屏蔽了内部的细节,在用户使用的时候,彻底不知道BookShelfIterator的存在。学习

引入迭代器后,能够将元素的遍历和实现分离开来,以下面的代码中的while循环,没有依赖与BookShelf的实现,没有使用BookShelf的其它方法,只用了迭代器中hasNext和next方法。可复用指的是将一个类做为一个组件,当一个组件发生变化时,不须要对其它组件进行修改或者只进行少许的修改就能够实现修改后的功能。一样的Iterator it = bookShelf.iterator();面向接口编程,便于程序的修改和维护。this

Iterator it = bookShelf.iterator();
while (it.hasNext()){
    Book book = (Book) it.next();
    System.out.println("你选择的英雄是:"+book.getName());
}

5、总结spa

迭代器的种类很是多,咱们能够根据遍历的次序进行设计,来实现相应的功能。从该设计模式中咱们能够看到接口的应用,面向接口编程的概念,以及元素的遍历与实现分离,实现了高内聚低耦合。.net

 

浅谈设计模式<最通俗易懂的讲解>

相关文章
相关标签/搜索