一天一个设计模式——迭代器模式
Posted zheng-hong-bo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一天一个设计模式——迭代器模式相关的知识,希望对你有一定的参考价值。
一、模式说明
迭代操作在程序开发中很常见:在数据集合中按顺序便利所有元素(例如:遍历一个数组中的所有元素),将遍历时使用的索引(如访问数组循环变量i)抽象化、通用化后形成的模式就是迭代器模式。
核心的迭代器一般包含两个方法:hasNext()和next()方法,前一个方法用于判断集合中是否还存在下一个需要迭代的元素,返回值类型是Bool类型;next()方法用于返回集合中一个元素,并且将迭代器移动到下一个元素。
该模式的UML图和示例代码UML图如下:
迭代模式的UML很简单,包含两个接口:Aggregate接口和Iterator接口,对应ConcreteAggregate角色和ConcreteIterator角色。
- Aggregate接口包含一个iterator方法,该方法返回一个iterator迭代器。
- Iterator接口包含hasNext()和next()两个方法。
上图中,设计两个接口,而没有只使用一个Iterator接口,原因在于我们需要将“遍历功能”独立于ConcreteAggregate角色之外,这样就可以针对一个ConcreteAggregate角色编写多种不同的ConcreteIterator角色(从前向后遍历、从后向前遍历previous、跳跃遍历)。
二、模式中的角色:
- Iterator:迭代器角色:定义访问和遍历元素的接口;
- Aggregate:集合角色:定义创建Iterator迭代器的接口;
- ConcreteIterator:迭代器实现类;
- ConcreteAggretator:具体聚合实现累;
三、模式代码示例:
(代码分为两个包,patterndesign包用于设计模式的代码实现,patterndemostrate用于模式代码的使用实例说明)
代码结构:
模式相关代码:
Aggregrate接口:
package com.designpattern.cn.iteratorpattern.patterndesign; public interface Aggregate public abstract Iterator iterator();
Iterator接口:
package com.designpattern.cn.iteratorpattern.patterndesign; public interface Iterator public abstract boolean hasNext(); public abstract Object next();
模式实现演示:
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;
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);
迭代器类(实现了书架类(模拟集合)中元素的迭代):
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;
运行结果:
四、相关的模式
- Visitor模式(访问者模式):迭代模式仅仅遍历取出元素,并没有做任何处理,如果遍历元素的同时对每个元素做相同的处理,则这种模式是visitor模式(访问者模式);
- Factory Method模式(工厂方法模式):在iterator方法中生成Iterator实例时可能采用到工厂方法模式;
此随笔参照中国工信出版集团,人民邮电出版社的《图解设计模式》梳理。
以上是关于一天一个设计模式——迭代器模式的主要内容,如果未能解决你的问题,请参考以下文章