title: 迭代器模式
author: rack-leen
avatar: /images/favicon.png
authorDesc: 脱发典范
comments: true
copyright: true
date: 2019-5-19 22:13:33
tags:
Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.
它提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节
我们现在模拟map容器的元素迭代。
package org.example.iterator;
/**
* 迭代器接口,java有现成的迭代器模式,每个java中的容器(map,set,list)都是用迭代器模式实现的
*/
public interface Iterator {
/* 判断下一个迭代元素是否存在 */
public boolean hasNext();
/* 获取下一个迭代元素 */
public Object next();
/* 溢出当前迭代n元素 */
public boolean remove();
}
package org.example.iterator;
import java.util.Vector;
/**
* 具体迭代器
*/
public class ConcreteIterator implements Iterator {
/* 用来存放需要迭代的集合 */
private Vector vector = new Vector() ;
/* 当前迭代所在游标处 */
public int cursor = 0 ;
/**
* 将输入的需要迭代的集合存放到当前类的容器中,用于迭代
* @param vector
*/
public ConcreteIterator(Vector vector){
this.vector = vector ;
}
/**
* 判断是否有下一个迭代元素
* @return
*/
@Override
public boolean hasNext() {
/* 如果当前游标所在的位置已经是集合末尾,表示没有下一个迭代元素 */
if (this.cursor == this.vector.size()){
return false ;
}else {
return true ;
}
}
/**
* 用来获取下一个迭代元素
* @return
*/
@Override
public Object next() {
Object result = null ;
/* 如果下一个迭代元素存在,就返回下一个迭代元素 */
if (this.hasNext()){
result = this.vector.get(this.cursor++) ;
}else {
result = null ;
}
return result ;
}
/**
* 移出当前迭代的元素,移出方法使用容器实现的移除方法
* @return
*/
@Override
public boolean remove() {
this.vector.remove(this.cursor);
return true;
}
}
package org.example.iterator;
/**
* 抽象容器
*/
public interface Aggregate {
/* 将元素增加到容器中 */
public void add(Object object);
/* 将指定元素移出容器 */
public void remove(Object object);
/* 用来迭代容器中的元素 */
public Iterator iterator() ;
}
package org.example.iterator;
import java.util.Vector;
/**
* 具体容器
*/
public class ConcreteAggregate implements Aggregate {
/* 用来存放使用add的元素对象 */
private Vector vector = new Vector() ;
/**
* 用来增加object到容器中
* @param object
*/
@Override
public void add(Object object) {
this.vector.add(object);
}
/**
* 将元素object从容器中移除
* @param object
*/
@Override
public void remove(Object object) {
this.vector.remove(object);
}
/**
* 容器的迭代器,创建一个迭代器对象,获取一个迭代器,用来迭代容器中的元素
* @return
*/
@Override
public Iterator iterator() {
return new ConcreteIterator(vector);
}
}
public class App {
/**
* 迭代器模式,使用方式和map迭代器相同
* @param args
*/
public static void main(String[] args) {
/**
* 创建容器对象,将元素加入容器
*/
ConcreteAggregate aggregate = new ConcreteAggregate();
aggregate.add("a");
aggregate.add("b");
aggregate.add("c");
/* 从容器中获取迭代器对象 */
Iterator iterator = aggregate.iterator();
/* 通过迭代器来进行元素迭代 */
while (iterator.hasNext()){
Object next = iterator.next();
System.out.println(next);
}
}
}