16、ITEPTER(迭代器模式)
2019-05-28 本文已影响0人
我要扭开奥利奥
目的
提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部展示。
使用场景
- 访问一个聚合对象又不暴露他的外部显示
- 支持对聚合对象的多种遍历
- 为遍历不同的对象提供一个统一的接口,即支持多态迭代
使用场景
对于迭代器模式,我们最熟悉的就是Java的各种List的迭代器了。通过迭代器我们可以对于列表进行遍历,但是又不需要访问其内部元素也就是不需要进行下标访问。
对于该模式我很感兴趣,对其进行实现如下:
首先我们需要实现容器,也就是我们迭代的对象
/**
* 容器接口,定义了基本操作
*/
public interface MyList {
void add(Object o);
Object get(int index);
Iterator iterator();
int getSize();
}
/**
* 容器具体实现类,通过该类具体实现list的基本功能
*/
public class ConcreteList implements MyList{
private Object[] list;
private int size = 0; //代表最多能够存放多少数据
private int index = 0; //代表已经存放了多少数据
public ConcreteList(){
index = 0;
size = 8;
list = new Object[size];
}
@Override
public void add(Object o){
if(index < size){
list[index++] = o;
}else{
//数组长度不够,扩容
Object[] tmp = new Object[size<<1];
for(int i = 0;i < index;i++){
tmp[i] = list[i];
}
tmp[index++] = o;
list = tmp;
}
}
@Override
public Iterator iterator(){
return new ConcreteIterator(this);
}
@Override
public Object get(int index){
if(index < size){ //判断区间是否正常
return list[index];
}else{
return null;
}
}
@Override
public int getSize(){
return index;
}
}
现在我们需要实现的就是迭代器了,为了提高迭代器的扩展型性和适用性,我们把迭代器操作的的对象设置为Object类
/**
* 为了简单起见,只实现两个最简单的功能
* 为了支持多态性,next的返回值为Object
*/
public interface Iterator {
boolean hasNext();
Object next();
}
/**
* 迭代器接口的具体实现类,在这个类里面实现接口定义的功能
*/
public class ConcreteIterator implements Iterator{
private MyList list = null;
private int index;
public ConcreteIterator(MyList list){
super();
this.list = list;
}
@Override
public boolean hasNext(){
return index < list.getSize();
}
@Override
public Object next(){
if(index < list.getSize())
return list.get(index++);
else
return null;
}
}
最后是测试文件
public class Client {
public static void main(String[] args) {
MyList list = new ConcreteList();
//由于Java对于基本类型会进行自动装箱
//因此可以直接添加基本类型数据
list.add(10);
list.add(20);
list.add(30);
list.add(1.23f);
list.add(3.45d);
Iterator iterator = new ConcreteIterator(list);
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
输出结果如下:
10
20
30
1.23
3.45