写点什么

IteratorPattern- 迭代器模式

作者:梁歪歪 ♚
  • 2022 年 6 月 02 日
  • 本文字数:2454 字

    阅读完需:约 8 分钟

IteratorPattern-迭代器模式

迭代器模式

迭代器模式(Iterator Pattern):又称为游标者模式(Cursor Pattern),其提供了一种顺序访问集合或者容器中对象元素的方法,而又无需暴露集合内部表示。


迭代器模式可以为不同容器提供一致的遍历行为,而且不用关心内部元素的组成结构,属于行为型模式,其本质是抽离集合对象迭代行为到迭代容器中,并提供统一的访问接口。


示例:我们乘坐地铁、高铁、飞机时,需要过安检,检查行李的机器是将行李一件一件通过传送带从起点传到终点的,而我们的迭代器思想就是这样的,不断的去迭代。我们就通过安检传送行李来举例说明...


  • 行李类Baggage.java


package cn.liangyy.iterator;
/** * 行李类 */public class Baggage { //行李名称 private String name;
public Baggage(String name){ this.name = name; }
public String getName(){ return name; }
public void setName(String name){ this.name = name; }}
复制代码


  • 迭代器接口IMyIterator.java


package cn.liangyy.iterator;
/** * 迭代器接口 */public interface IMyIterator<E> { /** * 遍历下一个元素 */ E next();
/** * 是否有下一个元素 */ boolean hasNext();}
复制代码


  • 具体的迭代器类MyIteratorImpl.java


package cn.liangyy.iterator;
import java.util.List;
/** * 具体的迭代器类 */public class MyIteratorImpl<E> implements IMyIterator<E> { //需要迭代的集合 private List<E> list; //游标,即集合中元素的位置 private int cursor; //集合中的元素 private E element; //集合中的大小 private int size;
public MyIteratorImpl(List<E> list) { this.list = list; this.size = list.size(); }
/** * 遍历下一个元素 */ @Override public E next() { //根据游标获取当前元素 E element = list.get(cursor); cursor++; return element; }
/** * 是否有下一个元素 */ @Override public boolean hasNext() { return cursor != size; }}
复制代码


  • 集合接口类IBaggageCollection.java


package cn.liangyy.iterator;
/** * 集合接口类 */public interface IBaggageCollection { /** * 添加元素 * @param baggage */ void add(Baggage baggage);
/** * 移除元素 * @param baggage */ void remove(Baggage baggage);
/** * 集合大小 * @return */ int size();
/** * 构建一个迭代器对象 * @return */ IMyIterator<Baggage> iterator();}
复制代码


  • 具体的集合类BaggageCollectionImpl.java


package cn.liangyy.iterator;
import java.util.ArrayList;import java.util.List;
/** * 具体的集合类 */public class BaggageCollectionImpl implements IBaggageCollection { private List list;
public BaggageCollectionImpl() { this.list = new ArrayList(); }
/** * 添加元素 * @param baggage */ @Override public void add(Baggage baggage) { list.add(baggage); }
/** * 移除元素 * @param baggage */ @Override public void remove(Baggage baggage) { list.remove(baggage); }
/** * 集合大小 * @return */ @Override public int size() { return list.size(); }
/** * 构建一个迭代器对象 * @return */ @Override public IMyIterator<Baggage> iterator() { //返回一个自定义迭代器 return new MyIteratorImpl<Baggage>(list); }}
复制代码


  • 测试类TestIterator.java


package cn.liangyy.iterator;
/** * 迭代器模式-测试 */public class TestIterator { public static void main(String[] args) { //初始化一个自定义集合 IBaggageCollection iBaggageCollection = initBaggage(); System.out.println("当前对象元素个数为:"+iBaggageCollection.size()+"个!"); //获取自定义迭代器 IMyIterator<Baggage> it = iBaggageCollection.iterator(); //开始迭代容器内元素 while (it.hasNext()){ Baggage baggage = it.next(); System.out.println(baggage.getName()); } }
private static IBaggageCollection initBaggage() { IBaggageCollection iBaggageCollection = new BaggageCollectionImpl(); //初始化10个箱子进集合等待迭代 for (int i = 0;i < 10;i++){ Baggage box = new Baggage("箱子"+(i+1)); iBaggageCollection.add(box); } return iBaggageCollection; }}
复制代码


上述例子就是一个简单的迭代器模式的实现,基本上是仿照 List 来实现的一个简易版本的迭代器模式,这种模式我们在开发中用的很少,是因为目前我们用到的数据结构其本身就提供了迭代器,我们就没必要去重复造轮子了。


迭代器模式适用场景


  • 访问一个集合对象的内容而不想暴露它的内部表示。

  • 为遍历不同的集合提供一个统一的访问接口。


迭代器模式优点


  • 迭代器模式封装了具体的迭代算法(即使迭代器内部算法发生变化,也不会影响到原有的集合对象),实现了迭代与集合的解耦。

  • 迭代器模式将集合对象本身应该提供的元素迭代接口放到了迭代器中,使得集合对象可以无需关心具体的迭代行为。

  • 迭代器模式为不同聚合结构的集合提供了一致的遍历接口,即一个迭代器可以用来迭代不同的集合对象(多态迭代)。


迭代器模式缺点迭代器模式如果用于简单的数据结构(如数组或者链表)时,反而会使得迭代元素方式变得更加繁琐复杂化。

发布于: 刚刚阅读数: 3
用户头像

梁歪歪 ♚

关注

还未添加个人签名 2021.07.22 加入

还未添加个人简介

评论

发布
暂无评论
IteratorPattern-迭代器模式_设计模式_梁歪歪 ♚_InfoQ写作社区