设计模式之迭代器模式

在需要迭代的对象类中实现迭代器接口,接着在一个迭代对象管理类中把这些需要迭代的对象一个个遍历出来即可。首先设计一个获取迭代对象的接口,然后将需要迭代的对象类实现该接口,再设计一个管理迭代对象的类,最后是一个客户端主类。

获取迭代对象的接口:

package com.freshbin.pattern.iterator.myexample.iterator;

import java.util.Iterator;

/**
 * 管理需要遍历的对象接口
 * 
 * @author freshbin
 * @date 2019-1-8 11:44:17
 */
public interface ContainerInterface {
	Iterator<String> getIterator();
}

需要迭代的对象类:

package com.freshbin.pattern.iterator.myexample.iterator;

import java.util.Iterator;

import com.sun.xml.internal.ws.dump.LoggingDumpTube.Position;

/**
 * GloryOfKingGame 
 * 
 * @author freshbin
 * @date 2019-1-8 11:46:07
 */
public class GloryOfKingGame implements ContainerInterface {

	private final static Integer MAX_ARRAY_SIZE = 10;
	private Integer index = 0;
	
	private String[] heros = new String[MAX_ARRAY_SIZE];
	
	public GloryOfKingGame() {
		addItems("亚瑟");
		addItems("后羿");
		addItems("鲁班");
		addItems("安琪拉");
		addItems("程咬金");
		addItems("项羽");
	}
	
	private void addItems(String name) {
		heros[index] = name;
		index++;
	}
	
	@Override
	public Iterator<String> getIterator() {
		return new GloryOfKingIterator();
	}
	
	class GloryOfKingIterator implements Iterator {

		private Integer position = 0;
		
		@Override
		public boolean hasNext() {
			if(position < index) {
				return true;
			}
			
			return false;
		}

		@Override
		public Object next() {
			String name = heros[position];
			position++;
			return name;
		}
		
	}

}
package com.freshbin.pattern.iterator.myexample.iterator;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * LOLGame 
 * @author freshbin
 * @date 2019-1-8 11:46:07
 */
public class LOLGame implements ContainerInterface {

	private List<String> heros;
	
	public LOLGame() {
		heros = new ArrayList<>();
		heros.add("盖伦");
		heros.add("寒冰");
		heros.add("马尔扎哈");
		heros.add("蛮王");
		heros.add("剑圣");
		heros.add("赵信");
	}
	
	@Override
	public Iterator<String> getIterator() {
		//return new LOLIterator();
		return heros.iterator();
	}

	/*class LOLIterator implements Iterator {

		private Integer position = 0;
		
		@Override
		public boolean hasNext() {
			if(position < heros.size()) {
				return true;
			}
			
			return false;
		}

		@Override
		public Object next() {
			String name = heros.get(position);
			position++;
			return name;
		}
		
	}*/
}

这里使用内部类实现迭代器接口,因为list已经实现了Iterator接口,所以就可以不用内部类实现迭代器接口了。

管理迭代对象的类:

package com.freshbin.pattern.iterator.myexample;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * 遍历迭代器
 * 
 * @author freshbin
 * @date 2019-1-8 12:04:42
 */
public class ManagerIterator {
	private List<Iterator> iterators;
	private Integer parallelFlag = 0;
	private Integer chuanxingFlag = 0;

	public ManagerIterator() {
		iterators = new ArrayList<>();
	}

	public void addIterator(Iterator iterator) {
		iterators.add(iterator);
	}

	public void parallelDisplayIterator() {
		System.out.println("并行方式");
		iterators.stream().parallel().forEach(iterator -> {
			System.out.println("==========开始================" + parallelFlag);
			while (iterator.hasNext()) {
				System.out.println(iterator.next());
			}

			System.out.println("===========结束===============" + parallelFlag);
			parallelFlag++;
		});
	}

	public void chuanxingDisplayIterator() {
		System.out.println("串行方式");
		iterators.stream().forEach(iterator -> {
			System.out.println("==========开始===============" + chuanxingFlag);
			while (iterator.hasNext()) {
				System.out.println(iterator.next());
			}

			System.out.println("==========开始===============" + chuanxingFlag);
			chuanxingFlag++;
		});
	}
}

这里使用了jdk8的并行遍历集合,第一次用这个形式遍历集合,看起来遍历方法内部像是会存在多线程问题

客户端主类:

package com.freshbin.pattern.iterator.myexample;

import com.freshbin.pattern.iterator.myexample.iterator.ContainerInterface;
import com.freshbin.pattern.iterator.myexample.iterator.GloryOfKingGame;
import com.freshbin.pattern.iterator.myexample.iterator.LOLGame;

/**
 * 迭代器模式
 * 
 * @author freshbin
 * @date 2019-1-8 11:40:42
 */
public class IteratorPatternMain {
	public static void main(String[] args) {
		ContainerInterface lolIterator = new LOLGame();
		ContainerInterface gloryOfKingIterator = new GloryOfKingGame();
		
		ManagerIterator managerIterator = new ManagerIterator();
		managerIterator.addIterator(lolIterator.getIterator());
		managerIterator.addIterator(gloryOfKingIterator.getIterator());
		
		managerIterator.parallelDisplayIterator();
//		managerIterator.chuanxingDisplayIterator();
	}
}

最后是效果图:

多运行几次可以看到,参数的赋值出现了问题,说明集合的元素不是一个个取出来遍历的。

github地址:https://github.com/freshbin/designPattern

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值