第0章:简介
迭代器模式定义:提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示
迭代器模式本质:控制访问聚合对象中的元素
参考:http://chjavach.iteye.com/blog/1634793 ,研磨设计模式(书籍),大话设计模式(书籍)
模式图:
待补充
第1章:实践
第0节:单向迭代器模式
(1)聚合对象接口(Aggregate.java)
package com.mcc.core.designPattern.behavior.iterator.singleIterator; /** * 聚合对象接口,聚合包括集合和数组 * * @author <a href="mailto:417877417@qq.com">menergy</a> * DateTime: 14-3-16 下午12:32 */ public abstract class Aggregate { /** * 获取当前元素 * @param index * @return */ public abstract Object get(int index); /** * 获取聚合大小 * @return */ public abstract int size(); /** * 创建迭代器对象 * @return */ public abstract Iterator createIterator(); } |
(2)迭代器实现类(AggregateExtends.java)
package com.mcc.core.designPattern.behavior.iterator.singleIterator; /** * 迭代器实现类,类似的实现类可以有多个,这里只用数组迭代为例,集合也是同理 * * @author <a href="mailto:417877417@qq.com">menergy</a> * DateTime: 14-3-16 下午12:36 */ public class AggregateExtends extends Aggregate { //聚合对象具体内容 private String[] strings = null; /** * 构造器,传入聚合内容 */ public AggregateExtends(String[] strings){ this.strings = strings; } /** * 获取当前元素 * @param index * @return */ @Override public Object get(int index){ Object obj = null; if(index < strings.length){ obj = strings[index]; } return obj; } /** * 获取聚合大小 * @return */ @Override public int size(){ return this.strings.length; } /** * 创建迭代器 * @return */ @Override public Iterator createIterator() { return new IteratorImpl(this); } } |
(3)迭代器接口(Iterator.java)
package com.mcc.core.designPattern.behavior.iterator.singleIterator; /** * 迭代器接口,单向迭代器 * * 迭代器模式的定义:提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示 * 迭代器模式的本质:控制访问聚合对象中的元素 * * @author <a href="mailto:417877417@qq.com">menergy</a> * DateTime: 14-3-16 下午12:24 */ public interface Iterator { /** * 移动到第一个位置 */ public void first(); /** * 移动到下一个位置 */ public void next(); /** * 判断是否有下一个位置 * @return */ public boolean hasNext(); /** * 获取当前元素 * @return */ public Object currentItem(); } |
(4)迭代器实现(IteratorImpl.java)
package com.mcc.core.designPattern.behavior.iterator.singleIterator; /** * 迭代器实现,单向迭代器 * * @author <a href="mailto:417877417@qq.com">menergy</a> * DateTime: 14-3-16 下午12:28 */ public class IteratorImpl implements Iterator { //内部索引 private int index = -1; //持有被迭代的具体聚合对象 private Aggregate aggregate; /** * 构造器,传入具体聚合对象 * @param aggregate */ public IteratorImpl(Aggregate aggregate){ this.aggregate = aggregate; } /** * 设置为第一位置 */ @Override public void first() { index = 0; } /** * 设置为下一个位置 */ @Override public void next() { if(index < this.aggregate.size() - 1){ index = index + 1; } } /** * 是否有下一个位置 * @return */ @Override public boolean hasNext() { return index < this.aggregate.size() - 1; } /** * 获取当前位置 * @return */ @Override public Object currentItem() { return this.aggregate.get(index); } } |
(5)客户端测试类(Client.java)
package com.mcc.core.designPattern.behavior.iterator.singleIterator; /** * 客户端测试类 * * @author <a href="mailto:417877417@qq.com">menergy</a> * DateTime: 14-3-16 下午12:55 */ public class Client { public static void main(String args[]){ String[] strings = {"test1","test2","test3","test4"}; //创建聚合对象 Aggregate aggregate = new AggregateExtends(strings); //迭代器 Iterator it = aggregate.createIterator(); //迭代输出 while(it.hasNext()){ //位置下移 it.next(); //取出当前元素 Object obj = it.currentItem(); System.out.println("当前元素:" + obj); } } } |
第1节:双向迭代器模式
(1)聚合对象接口(Aggregate.java)
package com.mcc.core.designPattern.behavior.iterator.singleIterator; /** * 聚合对象接口,聚合包括集合和数组 * * @author <a href="mailto:417877417@qq.com">menergy</a> * DateTime: 14-3-16 下午12:32 */ public abstract class Aggregate { /** * 获取当前元素 * @param index * @return */ public abstract Object get(int index); /** * 获取聚合大小 * @return */ public abstract int size(); /** * 创建迭代器对象 * @return */ public abstract Iterator createIterator(); } |
(2)迭代器实现类(AggregateExtends.java)
package com.mcc.core.designPattern.behavior.iterator.singleIterator; /** * 迭代器实现类,类似的实现类可以有多个,这里只用数组迭代为例,集合也是同理 * * @author <a href="mailto:417877417@qq.com">menergy</a> * DateTime: 14-3-16 下午12:36 */ public class AggregateExtends extends Aggregate { //聚合对象具体内容 private String[] strings = null; /** * 构造器,传入聚合内容 */ public AggregateExtends(String[] strings){ this.strings = strings; } /** * 获取当前元素 * @param index * @return */ @Override public Object get(int index){ Object obj = null; if(index < strings.length){ obj = strings[index]; } return obj; } /** * 获取聚合大小 * @return */ @Override public int size(){ return this.strings.length; } /** * 创建迭代器 * @return */ @Override public Iterator createIterator() { return new IteratorImpl(this); } } |
(3)迭代器接口(Iterator.java)
package com.mcc.core.designPattern.behavior.iterator.doubleIterator; /** * 迭代器接口,双向迭代器 * * @author <a href="mailto:417877417@qq.com">menergy</a> * DateTime: 14-3-16 下午12:24 */ public interface Iterator { /** * 移动到第一个位置 */ public void first(); /** * 移动到下一个位置 */ public void next(); /** * 判断是否有下一个位置 * @return */ public boolean hasNext(); /** * 获取当前元素 * @return */ public Object currentItem(); /** * 移动到上一个位置 */ public void previous(); /** * 判断是否有上一个位置 */ public boolean hasPrevious(); } |
(4)迭代器实现(IteratorImpl.java)
package com.mcc.core.designPattern.behavior.iterator.doubleIterator; /** * 迭代器实现 * * @author <a href="mailto:417877417@qq.com">menergy</a> * DateTime: 14-3-16 下午12:28 */ public class IteratorImpl implements Iterator { //内部索引 private int index = -1; //持有被迭代的具体聚合对象 private Aggregate aggregate; /** * 构造器,传入具体聚合对象 * @param aggregate */ public IteratorImpl(Aggregate aggregate){ this.aggregate = aggregate; } /** * 设置为第一位置 */ @Override public void first() { index = 0; } /** * 设置为下一个位置 */ @Override public void next() { if(index < this.aggregate.size() - 1){ index = index + 1; } } /** * 是否有下一个位置 * @return */ @Override public boolean hasNext() { return index < this.aggregate.size() - 1; } /** * 获取当前位置 * @return */ @Override public Object currentItem() { return this.aggregate.get(index); } /** * 移动到前一个位置 */ @Override public void previous() { if(index > 0){ index = index - 1; } } /** * 是否有前一个位置 * @return */ @Override public boolean hasPrevious() { return index > 0; } } |
(5)客户端测试类(Client.java)
package com.mcc.core.designPattern.behavior.iterator.doubleIterator; /** * 客户端测试类 * * @author <a href="mailto:417877417@qq.com">menergy</a> * DateTime: 14-3-16 下午12:55 */ public class Client { public static void main(String args[]){ String[] strings = {"test1","test2","test3","test4"}; //创建聚合对象 Aggregate aggregate = new AggregateExtends(strings); //迭代器 Iterator it = aggregate.createIterator(); //迭代输出 while(it.hasNext()){ //位置下移 it.next(); //取出当前元素 Object obj = it.currentItem(); System.out.println("正向迭代元素:" + obj); } //反向迭代输出 while(it.hasPrevious()){ //位置下移 it.previous(); //取出当前元素 Object obj = it.currentItem(); System.out.println("反向迭代元素:" + obj); } } } |
第2节:java自带迭代器模式
(1)聚合对象接口(Aggregate.java)
package com.mcc.core.designPattern.behavior.iterator.javaIterator; import java.util.Iterator; /** * 聚合对象接口,聚合包括集合和数组 * * @author <a href="mailto:417877417@qq.com">menergy</a> * DateTime: 14-3-16 下午12:32 */ public abstract class Aggregate { /** * 获取当前元素 * @param index * @return */ public abstract Object get(int index); /** * 获取聚合大小 * @return */ public abstract int size(); /** * 创建迭代器对象,调用java自带的迭代器 * @return */ public abstract Iterator createIterator(); } |
(2)迭代器实现类(AggregateExtends.java)
package com.mcc.core.designPattern.behavior.iterator.javaIterator; import java.util.Arrays; import java.util.Iterator; /** * 迭代器实现类,类似的实现类可以有多个,这里只用数组迭代为例,集合也是同理 * * @author <a href="mailto:417877417@qq.com">menergy</a> * DateTime: 14-3-16 下午12:36 */ public class AggregateExtends extends Aggregate { //聚合对象具体内容 private String[] strings = null; /** * 构造器,传入聚合内容 */ public AggregateExtends(String[] strings){ this.strings = strings; } /** * 获取当前元素 * @param index * @return */ @Override public Object get(int index){ Object obj = null; if(index < strings.length){ obj = strings[index]; } return obj; } /** * 获取聚合大小 * @return */ @Override public int size(){ return this.strings.length; } /** * 创建迭代器,调用java自带的迭代器 * @return */ @Override public Iterator createIterator() { return Arrays.asList(strings).iterator(); } } |
(3)迭代器实现(IteratorImpl.java)
package com.mcc.core.designPattern.behavior.iterator.javaIterator; import java.util.Iterator; /** * 迭代器实现,实现java自带的迭代器 * * @author <a href="mailto:417877417@qq.com">menergy</a> * DateTime: 14-3-16 下午12:28 */ public class IteratorImpl implements Iterator { //内部索引 private int index = -1; //持有被迭代的具体聚合对象 private Aggregate aggregate; /** * 构造器,传入具体聚合对象 * @param aggregate */ public IteratorImpl(Aggregate aggregate){ this.aggregate = aggregate; } /** * 是否有下一个元素 * @return */ @Override public boolean hasNext() { return index < this.aggregate.size() - 1; } /** * 取当前元素后下移一个位置 * @return */ @Override public Object next() { Object obj = null; if (hasNext()){ obj = aggregate.get(index); index++; } return obj; } @Override public void remove() { //暂不实现 } } |
(4)客户端测试类(Client.java)
package com.mcc.core.designPattern.behavior.iterator.javaIterator; import java.util.Iterator; /** * 客户端测试类 * * @author <a href="mailto:417877417@qq.com">menergy</a> * DateTime: 14-3-16 下午12:55 */ public class Client { public static void main(String args[]){ String[] strings = {"test1","test2","test3","test4"}; //创建聚合对象 Aggregate aggregate = new AggregateExtends(strings); //迭代器 Iterator it = aggregate.createIterator(); //迭代输出 while(it.hasNext()){ //取出当前元素并位置下移 Object obj = it.next(); System.out.println("当前元素:" + obj); } } } |