设计模式之迭代器模式

迭代器模式

定义:提供一个对象来顺序访问聚合对象中得一系列数据,而不暴露聚合对象得内部表示

迭代器模式主要结构如下所示:

抽象聚合角色:定义存储,添加,删除聚合元素以及创建迭代器对象得接口

具体聚合角色:实现抽象聚合类,返回一个具体迭代器得实例

抽象迭代器角色:定义访问和遍历聚合元素得接口,通常包含hasNext(),next()等方法

具体迭代器角色:实现抽象迭代器接口中定义得方法,完成对聚合对象得遍历,纪录遍历得当前位置


案例实现

定义一个可以存储学生对象得容器,将遍历该容器得功能交由迭代器实现

代码实现如下:

定义抽象迭代器类

public interface Iterator<T> {
   boolean hasNext();

   T next();
}

定义具体迭代器类

public class IteratorImpl<T> implements Iterator<T>{
   //用于存储元素
   private final List<T> list;

   public IteratorImpl(List<T> list){
       this.list=list;
   }

   private int pos=0;

   @Override
   public boolean hasNext() {
       return pos<list.size();
   }

   @Override
   public T next() {
       T element=list.get(pos);
       pos++;
       return element;
   }
}

定义抽象聚合类

public interface Aggregate<T> {

   void add(T element);

   void remove(T element);

   //提供获取迭代器的接口
   Iterator<T> getIterator();
}

定义具体聚合角色

public class AggregateImpl<T> implements Aggregate<T>{
   private final List<T> list;

   public AggregateImpl(){
       list=new ArrayList<>();
   }

   @Override
   public void add(T element) {
       list.add(element);
   }

   @Override
   public void remove(T element) {
       list.remove(element);
   }

   @Override
   public Iterator<T> getIterator() {
       return new IteratorImpl<>(list);
   }
}

定义学生类用于测试

public class Student {
   private String name;

   public Student(String name){
       this.name=name;
   }

   public String getName(){
       return this.name;
   }

   public void setName(String name){
       this.name=name;
   }
}

定义测试类对迭代器模式进行测试

public class Test {
   public static void main(String[] args) {
       AggregateImpl<Student> aggregate=new AggregateImpl<>();

       Student student1=new Student("张三");
       Student student2=new Student("李四");
       Student student3=new Student("王五");
       Student student4=new Student("赵六");

       aggregate.add(student1);
       aggregate.add(student2);
       aggregate.add(student3);
       aggregate.add(student4);

       Iterator<Student> iterator= aggregate.getIterator();

       while(iterator.hasNext()){
           System.out.println(iterator.next().getName());
       }
   }
}

迭代器模式优缺点

优点

它支持以不同的方式遍历迭代对象,在同一个聚合对象上可以定义多种遍历方式。在迭代器模式中只需要用一个不同的迭代器来替换原有迭代器即可改变遍历算法。我们也可以自己定义迭代器的子类以支持新的遍历方式。

迭代器简化了聚合类。由于引入了迭代器,在原有的聚合对象中不需要再自行提供数据遍历等方法,这样可以简化聚合类的设计

在迭代器模式中,由于引入了抽象层。增加新的聚合类和迭代器类都很方便,无需修改原有的代码。,满足开闭原则

缺点

增加了类的个数,在一定程度上增加了系统的复杂度

迭代器模式的使用场景

当需要为聚合对象提供多种遍历方式时

当需要为遍历不同的聚合结构提供一个统一的接口时

当访问一个聚合对象的内容而无需暴露其内部细节表示时

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值