一天一个设计模式——迭代器模式

1、模式说明设计模式

迭代操做在程序开发中很常见:在数据集合中按顺序便利全部元素(例如:遍历一个数组中的全部元素),将遍历时使用的索引(如访问数组循环变量i)抽象化、通用化后造成的模式就是迭代器模式。数组

核心的迭代器通常包含两个方法:hasNext()和next()方法,前一个方法用于判断集合中是否还存在下一个须要迭代的元素,返回值类型是Bool类型;next()方法用于返回集合中一个元素,而且将迭代器移动到下一个元素。app

该模式的UML图和示例代码UML图以下:ide

 

 

迭代模式的UML很简单,包含两个接口:Aggregate接口和Iterator接口,对应ConcreteAggregate角色和ConcreteIterator角色。this

  • Aggregate接口包含一个iterator方法,该方法返回一个iterator迭代器。
  • Iterator接口包含hasNext()和next()两个方法。

上图中,设计两个接口,而没有只使用一个Iterator接口,缘由在于咱们须要将“遍历功能”独立于ConcreteAggregate角色以外,这样就能够针对一个ConcreteAggregate角色编写多种不一样的ConcreteIterator角色(从前向后遍历、从后向前遍历previous、跳跃遍历)。spa

2、模式中的角色:设计

  • Iterator:迭代器角色:定义访问和遍历元素的接口;
  • Aggregate:集合角色:定义建立Iterator迭代器的接口;
  • ConcreteIterator:迭代器实现类;
  • ConcreteAggretator:具体聚合实现累;

3、模式代码示例:code

(代码分为两个包,patterndesign包用于设计模式的代码实现,patterndemostrate用于模式代码的使用实例说明)blog

代码结构:索引

模式相关代码:

Aggregrate接口:

package com.designpattern.cn.iteratorpattern.patterndesign;

public interface Aggregate {
    public abstract Iterator iterator();
}
View Code

Iterator接口:

package com.designpattern.cn.iteratorpattern.patterndesign;

public interface Iterator {
    public abstract boolean hasNext();
    public abstract Object next();
}
View Code

 

模式实现演示:

Book书籍类:

package com.designpattern.cn.iteratorpattern.patterndemostrate;

public class Book {
    private String name;

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

    public String getName() {
        return name;
    }
}
View Code

BookShelf书架类(相似模拟一个集合类):

package com.designpattern.cn.iteratorpattern.patterndemostrate;

import com.designpattern.cn.iteratorpattern.patterndesign.Aggregate;
import com.designpattern.cn.iteratorpattern.patterndesign.Iterator;

public class BookShelf implements Aggregate {

    private Book books[];
    private int last = 0;

    public BookShelf(int size){
        this.books = new Book[size];
    }

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

    public void appendBook(Book book){
        this.books[last] = book;
        last++;
    }

    public int getLength(){
        return last;
    }

    @Override
    public Iterator iterator() {
        return new BookShelfIterator(this);
    }
}
View Code

迭代器类(实现了书架类(模拟集合)中元素的迭代):

package com.designpattern.cn.iteratorpattern.patterndemostrate;

import com.designpattern.cn.iteratorpattern.patterndesign.Iterator;

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

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

    public boolean hasNext(){
        return index < bookShelf.getLength();
    }

    public Object next(){
        Book book = bookShelf.getBookAt(index);
        index++;
        return book;
    }
}
View Code

运行结果:

 

4、相关的模式

  • Visitor模式(访问者模式):迭代模式仅仅遍历取出元素,并无作任何处理,若是遍历元素的同时对每一个元素作相同的处理,则这种模式是visitor模式(访问者模式);
  • Factory Method模式(工厂方法模式):在iterator方法中生成Iterator实例时可能采用到工厂方法模式;

 

 

此随笔参照中国工信出版集团,人民邮电出版社的《图解设计模式》梳理。

相关文章
相关标签/搜索