banner
jzman

jzman

Coding、思考、自觉。
github

迭代器設計模式

PS:任何美好的事情當變得習以為常的時候都會變得不再珍貴。

迭代器設計模式是一種常用的設計模式,用於提供一種方法順序訪問一個聚合對象中的各種元素,但是又不暴露該對象的內部表示,迭代器設計模式屬於行為型設計模式。

  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

迭代器設計模式雖然在遍歷集合時經常用到,但是可能在使用的時候沒有任何設計模式的概念,這樣的概念會潛移默化的提高自己的編碼能力。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。