设计模式之迭代器设计模式

原文首发于微信公众号:躬行之(jzman-blog)

迭代器设计模式是一种常用的设计模式,用于提供一种方法顺序访问一个聚合对象中的各种元素,但是又不暴露该对象的内部表示,迭代器设计模式属于行为型设计模式。

  1. 相关概念
  2. 使用场景
  3. Java实现
  4. Dart实现
相关概念
  • 抽象聚合角色:定义添加、删除等操作聚合对象的方法以及创建迭代器的方法;
  • 具体聚合角色:抽象聚合角色的具体实现类;
  • 抽象迭代器角色:定义迭代器相关方法,比如 hasNxt、first、last等方法;
  • 具体迭代器角色:抽象迭代器角色的具体实现类。
使用场景

迭代器设计模式的使用场景如下:

  1. 为定义的某种特定的数据结构提供遍历方式;
  2. 为了隐藏聚合对象实现细节可以使用迭代器设计模式;
  3. 当有多种聚合对象并存时,使用迭代器设计模式可以屏蔽这种因数据结构不同的差异;
Java实现

简单实现一下迭代器设计模式,定义抽象聚合角色如下:

/**
 * 抽象聚合角色
 * Created by jzman
 * Powered by 2019/12/22.
 */
interface Aggregate {
    Iterator createIterator();
}

定义抽象迭代器角色如下:

/**
 * 抽象迭代器角色
 * Created by jzman
 * Powered by 2019/12/22.
 */
interface Iterator {
    Object first();
    Object next();
    boolean isDone();
    Object currentItem();
}

实现具体的聚合角色和具体的迭代器角色如下:

/**
 * 具体的聚合角色
 * Created by jzman
 * Powered by 2019/12/22.
 */
class ConcreteAggregate implements Aggregate {
    private List<Object> mList;
    
    public ConcreteAggregate(List<Object> mList) {
        this.mList = mList;
    }
    
    @Override
    public Iterator createIterator() {
        return new ConcreteIterator();
    }

    /**
     * 具体的迭代器角色
     */
    private class ConcreteIterator implements Iterator {

        private int mCursor;

        @Override
        public Object first() {
            return mList.get(0);
        }

        @Override
        public Object next() {
            mCursor++;
            if (mCursor < mList.size()) {
                return mList.get(mCursor);
            }
            return null;
        }

        @Override
        public boolean isDone() {
            return mCursor >= mList.size();
        }

        @Override
        public Object currentItem() {
            return mList.get(mCursor);
        }
    }
}

测试上述代码:

/**
 * 迭代器测试
 * Created by jzman
 * Powered by 2019/12/22.
 */
class Client {
    public static void main(String[] args) {
        List<Object> objects = new ArrayList<>();
        objects.add("A");
        objects.add("B");
        objects.add("C");
        ConcreteAggregate aggregate = new ConcreteAggregate(objects);

        // 获取迭代器
        Iterator iterator = aggregate.createIterator();
        // 遍历
        while (!iterator.isDone()) {
            Object o = iterator.currentItem();
            System.out.println("data:" + o);
            iterator.next();
        }
    }
}

测试结果如下:

data:A
data:B
data:C
Dart实现
main(){
  List<Object> mList = ["A","B","C"];
  Aggregate aggregate = new ConcreteAggregate(mList);
  Iterator iterator = aggregate.createIterator();
  while (!iterator.isDone()) {
    Object obj = iterator.currentItem();
    print("data:${obj.toString()}");
    iterator.next();
  }
}

// 抽象迭代器角色
abstract class Iterator{
  Object first();
  Object next();
  bool isDone();
  Object currentItem();
}

//具体迭代器角色
class ConcreteIterator implements Iterator{
  int mCursor = 0;
  List<Object> mList;

  ConcreteIterator(this.mList);

  @override
  Object first() {
      return mList[0];
  }

  @override
  Object next() {
      mCursor++;
      if (mCursor < mList.length) {
          return mList[mCursor];
      }
      return null;
  }

  @override
  bool isDone() {
      return mCursor >= mList.length;
  }

  @override
  Object currentItem() {
      return mList[mCursor];
  }
}

// 抽象聚合角色
abstract class Aggregate {
  Iterator createIterator();
}

// 具体聚合角色
class ConcreteAggregate implements Aggregate{
  List<Object> mList;
  ConcreteAggregate(this.mList);
  @override
  Iterator createIterator(){
    return new ConcreteIterator(mList);
  }
}

测试效果如下:

data:A
data:B
data:C

迭代器设计模式虽然在遍历集合时经常用到,但是可能在使用的时候没有任何设计模式的概念,这样的概念会潜移默化的提高自己的编码能力。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

躬行之

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值