迭代器模式

描述

????迭代模式是對象的行為模式。迭代模式可以順序訪問集合對象的元素,不需要知道集合對象的底層表示。

簡介

迭代器類圖

????迭代器模式是通過將聚合對象的遍歷行為分離出來,抽象成迭代器類來實現(xiàn)的,其目的是在不暴露聚合對象的內(nèi)部結(jié)構(gòu)的情況下,讓外部代碼透明地訪問聚合的內(nèi)部數(shù)據(jù)?,F(xiàn)在我們來分析其基本結(jié)構(gòu)與實現(xiàn)方法。

角色

  • 抽象聚合(Aggregate)角色:定義存儲、添加、刪除聚合對象以及創(chuàng)建迭代器對象的接口。
  • 具體聚合(ConcreteAggregate)角色:實現(xiàn)抽象聚合類,返回一個具體迭代器的實例。
  • 抽象迭代器(Iterator)角色:定義訪問和遍歷聚合元素的接口,通常包含 hasNext()、first()、next() 等方法。
  • 具體迭代器(Concretelterator)角色:實現(xiàn)抽象迭代器接口中所定義的方法,完成對聚合對象的遍歷,記錄遍歷的當(dāng)前位置。

優(yōu)缺點

優(yōu)點

  • 訪問一個聚合對象的內(nèi)容而無須暴露它的內(nèi)部表示。
  • 遍歷任務(wù)交由迭代器完成,這簡化了聚合類。
  • 它支持以不同方式遍歷一個聚合,甚至可以自定義迭代器的子類以支持新的遍歷。
  • 增加新的聚合類和迭代器類都很方便,無須修改原有代碼。
  • 封裝性良好,為遍歷不同的聚合結(jié)構(gòu)提供一個統(tǒng)一的接口。

缺點

  • 增加了類的個數(shù),這在一定程度上增加了系統(tǒng)的復(fù)雜性。

使用場景

  • 訪問一個聚合對象的內(nèi)容而無須暴露它的內(nèi)部表示。
  • 需要為聚合對象提供多種遍歷方式。
  • 為遍歷不同的聚合結(jié)構(gòu)提供一個統(tǒng)一的接口。

示例

/**
* 抽象聚合(Aggregate)角色
*/
public interface Aggregate {
   void add(Object obj);
   void remove(Object obj);
   Iterator getIterator();
}
/**
* 具體聚合(ConcreteAggregate)角色
*/
public class ConcreteAggregate implements Aggregate {
   private List<Object> list = new ArrayList<Object>();

   @Override
   public void add(Object obj) {
       list.add(obj);
   }

   @Override
   public void remove(Object obj) {
       list.remove(obj);
   }

   @Override
   public Iterator getIterator() {
       return (new ConcreteIterator(list));
   }
}
/**
* 抽象迭代器(Iterator)角色
*/
public interface Iterator {
   Object first();
   Object next();
   boolean hasNext();
}
/**
* 具體迭代器(Concretelterator)角色
*/
public class ConcreteIterator implements Iterator {
   private List<Object> list = null;
   private int index = -1;

   public ConcreteIterator(List<Object> list) {
       this.list = list;
   }

   @Override
   public boolean hasNext() {
       if (index < list.size() - 1) {
           return true;
       } else {
           return false;
       }
   }

   @Override
   public Object first() {
       index = 0;
       Object obj = list.get(index);
       return obj;
   }

   @Override
   public Object next() {
       Object obj = null;
       if (this.hasNext()) {
           obj = list.get(++index);
       }
       return obj;
   }
}
/**
* 客戶端
*/
public class Client {
   public static void main(String[] args) {
       Aggregate ag = new ConcreteAggregate();
       ag.add("紅");
       ag.add("黃");
       ag.add("藍");
       ag.add("綠");
       System.out.print("聚合的內(nèi)容有:");
       Iterator it = ag.getIterator();
       while (it.hasNext()) {
           Object ob = it.next();
           System.out.print(ob.toString() + "\t");
       }
       Object ob = it.first();
       System.out.println("\nFirst:" + ob.toString());
   }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容