概论
什么是迭代器模式?迭代器模式是提供一种方法访问一个容器对象中的各个元素,而又不需要暴露该对象的细节。
迭代器模式示例
迭代器模式中分为4种角色。
①抽象迭代器
②具体迭代器
③抽象容器
④具体容器
首先我们一个抽象迭代器,抽象迭代器中包含遍历到下一个元素、判断遍历是否已经到了尾部、删除当前指向的元素。
1 public interface Iterator { 2 3 public Object next(); 4 public boolean hasNext(); 5 public boolean remove(); 6 }
第3行,声明一个函数,获取下一个元素。
第4行,声明一个函数,判断是否还有下一个元素。
第5行,声明一个函数,删除元素。
我们再来新增一个具体的迭代器:源代码如下所示:
1 public class DefaultIterator implements Iterator { 2 3 private Vector vector = new Vector(); 4 public int cursor = 0; 5 6 public DefaultIterator(Vector vector) { 7 this.vector = vector; 8 } 9 10 @Override 11 public Object next() { 12 13 if(this.hasNext()) { 14 return this.vector.get(cursor++); 15 } 16 return null; 17 } 18 19 @Override 20 public boolean hasNext() { 21 if(this.cursor == this.vector.size()) { 22 return false; 23 } 24 return true; 25 } 26 27 @Override 28 public boolean remove() { 29 this.vector.remove(this.cursor); 30 return true; 31 } 32 }
第3行:声明成员属性Vector
第4行:声明成员属性Cursor
第6行:带参数构造函数,用于初始化。
我们自定义一个抽象的容器接口:包含新增元素,删除元素,获取迭代器。
1 public interface Collection { 2 public void add(Object object); 3 public void remove(Object object); 4 public Iterator iterator(); 5 }
我们再定义一个具体的容器:
1 public class DefaultIterator implements Iterator { 2 3 private Vector vector = new Vector(); 4 public int cursor = 0; 5 6 public DefaultIterator(Vector vector) { 7 this.vector = vector; 8 } 9 10 @Override 11 public Object next() { 12 13 if(this.hasNext()) { 14 return this.vector.get(cursor++); 15 } 16 return null; 17 } 18 19 @Override 20 public boolean hasNext() { 21 if(this.cursor == this.vector.size()) { 22 return false; 23 } 24 return true; 25 } 26 27 @Override 28 public boolean remove() { 29 this.vector.remove(this.cursor); 30 return true; 31 } 32 }
最后我们增加一个场景类Client:代码如下图所示:
1 public class Client { 2 3 public static void main(String[] args) { 4 Collection collection = new DefaultCollection(); 5 collection.add("111"); 6 collection.add("222"); 7 collection.add("333"); 8 9 Iterator iterator = collection.iterator(); 10 while (iterator.hasNext()) { 11 System.out.println(iterator.next()); 12 } 13 } 14 }
当然我们的容器存在是基于Vector,存储的形式有很多比如ArrayList,数组等等,当然不一定局限集合,比如缓存等。而迭代器模式在实际中往往不会自己去定义,而是直接采用Java提供的Iterator接口。
原文地址:https://www.cnblogs.com/sunshine798798/p/10115828.html
时间: 2024-10-15 08:32:35