设计模式(16)------迭代器模式

来源:互联网 发布:男子遭遇网络诈骗 编辑:程序博客网 时间:2024/05/17 09:04

迭代器模式作用:

使用迭代器模式来提供对聚合对象的统一存取,即提供一个外部的迭代器来对聚合对象进行访问和遍历 ,

而又不需暴露该对象的内部结构。又叫做游标(Cursor)模式 。


应用场景:

(1)访问一个聚合对象的内容而无需暴露它的内部表示。

(2)为聚合对象提供多种遍历方式。

(3)为遍历不同的聚合结构提供一个统一的接口 (即, 支持多态迭代)。


参与对象:

(1) Iterator(抽象迭代器)

迭代器定义访问和遍历元素的接口。

(2)ConcreteIterator(具体迭代器)

具体迭代器实现迭代器Iterator接口。对该聚合遍历时跟踪当前位置。

(3)Aggregate(抽象聚合类)

聚合定义创建相应迭代器对象的接口。

(4)ConcreteAggregate(具体聚合类)

具体聚合实现创建相应迭代器的接口,该操作返回ConcreteIterator的一个适当的实例。


eg:

Iterator

package com.lanhuigu.base.design.behavior.iterator;/** * Iterator: 迭代器定义访问和遍历元素的接口 */public interface Iterator {Object next();void first();void last();boolean hasNext();}

ConcreteIterator

package com.lanhuigu.base.design.behavior.iterator;/** * ConcreteIterator: 具体迭代器实现迭代器Iterator接口 */public class IteratorImpl implements Iterator {private List list;private int index;public IteratorImpl(List list) {// TODO Auto-generated constructor stubindex = 0;this.list = list;}@Overridepublic void first() {// TODO Auto-generated method stubindex = 0;}@Overridepublic void last() {// TODO Auto-generated method stubindex = list.getSize();}@Overridepublic Object next() {// TODO Auto-generated method stubObject obj = list.get(index);index++;return obj;}@Overridepublic boolean hasNext() {// TODO Auto-generated method stubreturn index < list.getSize();}}

Aggregate

package com.lanhuigu.base.design.behavior.iterator;/** * Aggregate: 聚合定义创建相应迭代器对象的接口  */public interface List {Iterator iterator();Object get(int index);int getSize();void add(Object obj);}

ConcreteAggregate

package com.lanhuigu.base.design.behavior.iterator;/** * ConcreteAggregate: 具体聚合实现创建相应迭代器的接口,该操作返回ConcreteIterator的一个适当的实例 */public class ListImpl implements List {private Object[] list;private int index;private int size;public ListImpl() {// TODO Auto-generated constructor stubindex = 0;size = 0;list = new Object[100];}@Overridepublic Iterator iterator() {// TODO Auto-generated method stubreturn new IteratorImpl(this);}@Overridepublic Object get(int index) {// TODO Auto-generated method stubreturn list[index];}@Overridepublic int getSize() {// TODO Auto-generated method stubreturn this.size;}@Overridepublic void add(Object obj) {// TODO Auto-generated method stublist[index++] = obj;size ++;}}

Client

package com.lanhuigu.base.design.behavior.iterator;public class Test {public static void main(String[] args) {List list = new ListImpl();list.add("a");list.add("b");list.add("c");// 第一种迭代方式Iterator it = list.iterator();while (it.hasNext()) {System.out.println(it.next());}System.out.println("======");// 第二种迭代方式for (int i=0;i<list.getSize();i++) {System.out.println(list.get(i));}}}

运行结果:


0 0
原创粉丝点击