?? iteratorpattern.htm
字號:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<link rel="stylesheet" href="css/stdlayout.css" type="text/css">
<link rel="stylesheet" href="css/print.css" type="text/css">
<meta content="text/html; charset=gb2312" http-equiv="content-type">
<title>Iterator 模式</title>
</head>
<body>
<h3><a href="http://caterpillar.onlyfun.net/GossipCN/index.html">From
Gossip@caterpillar</a></h3>
<h1><a href="CppGossip.html">Design Pattern: Iterator 模式</a></h1>
在Java中提供有ArrayList類,您可以用它來設計一個動態的物件陣列,并在適當的時候取出陣列中的物
件,假設今天您要循序的訪問ArrayList中的所有物件,則您可能采取這樣的方式: <br>
<ul>
<li> Main.java
</li>
</ul>
<pre>import java.util.*;<br><br>public class Main {<br> public static void main(String[] args) {<br> List arrayList = new ArrayList();<br><br> for(int i = 0; i < 10; i++) <br> arrayList.add("Test " + i);<br><br> for(int i = 0; i < 10; i++) <br> System.out.println(arrayList.get(i).toString()); <br> } <br>} <br></pre>
<br>
在這個例子中,很幸運的,您的ArrayList物件可以透過get()方法,使用索引加上回圈的方式來循序訪問
ArrayList中的所有物件,不過并不是每一個聚合(aggregate)物件的內部實作都會是有索引結構的,也許是key/value的方式,或者
是其它的方式。<br>
由于每個聚合物件的內部實作方式不盡相同,如果您想要循序的訪問聚合物件中所有的物件,您要為不同的聚合物件設計不同的循序訪問介面,然而
這并不是個好方法,結果是您設計的聚合物件上將會有很多的循序訪問方法,而使用您的聚合物件的人,還必須知道這個聚合物件的類型,才能進一步知道如何使用
它所提供的方法。<br>
<br>
與其在聚合物件上直接設計遍訪的介面,不如設計一個介面Iterator,上面設計有統一的循序訪問,當您想要循序訪問聚合物件中的物件
時,將聚合物件中的物件加以包裝為一個Iterator后返回,客戶端只要面對Iterator所提供的介面,而不用面對為數眾多的聚合物件。<br>
<br>
采取迭代器(Iterator)的方法,一個迭代器提供一個特定的遍訪方法,而使得設計人員無需關心聚合物件的類型(可能是ArrayList或
LinkedList等),例如上面這個程式可以改為:<br>
<ul>
<li>Main.java</li>
</ul>
<pre>import java.util.*;<br><br>public class Main { <br> public static void main(String[] args) { <br> List arrayList = new ArrayList();<br> for(int i = 0; i < 10; i++) <br> arrayList.add("Test " +i);<br> visit(arrayList.iterator()); <br> }<br><br> public static visit(Iterator iterator) {<br> while(iterator.hasNext()) <br> System.out.println(iterator.next().toString()); <br> }<br>}</pre>
<br>
如上所示的,iterator()方法會傳回一個Iterator物件,這個物件提供的循序訪問的統一介面,如果您查詢 Java
API中的LinkedList所提供的方法,您會發現它的iterator()方法同樣也傳回Iterator物件,您無需關心您所使用的是
ArrayList或LinkedList,使用Iterator可以讓您以相同的方法來遍訪聚合物件的內容,以上例來說,visit()方法就可以重
用,它不特地服務于ArrayList或LinkedList。<br>
<div style="text-align: center;"><img style="width: 419px; height: 274px;" alt="Iterator" title="Iterator" src="images/iterator-1.jpg"><br>
</div>
<br>
意這個模型是簡化過后的版本,并不是Java中的設計,這么作只是為了方便說明,這個圖形說明了Iterator模式的基本結構。再來看另一個在
Thinking in Java的例子,可以說明使用Iterator的好處:<br>
<ul>
<li> HamsterMaze.java
</li>
</ul>
<pre>import java.util.*; <br><br>class Hamster { <br> private int hamsterNumber; <br> Hamster(int i) { hamsterNumber = i; } <br> public String toString() { <br> return "This is Hamster #" + hamsterNumber; <br> } <br>} <br><br>class Printer { <br> static void printAll(Iterator e) { <br> while(e.hasNext()) {<br> System.out.println(e.next()); <br> }<br> } <br>} <br><br>public class HamsterMaze { <br> public static void main(String[] args) { <br> ArrayList v = new ArrayList(); <br> for(int i = 0; i < 3; i++) {<br> v.add(new Hamster(i)); <br> }<br> Printer.printAll(v.iterator()); <br> } <br>} <br></pre>
<br>
對于Printer物件來說,它完全不用知道聚合物件的類型到底是ArrayList或是LinkedList,您只要傳回Iterator物件就可以
了,剩下的就是使用Iterator物件所提供的循序訪問方法來訪問所有的物件。 <br>
<br>
Iterator模式的 UML 結構圖如下所示: <br>
<div style="text-align: center;"><img style="width: 345px; height: 289px;" alt="Iterator" title="Iterator" src="images/iterator-2.jpg"><br>
</div>
<br>
使用Iterator模式,可以將循序訪問聚合對象的方法從該對象中分離出來,從而使得聚合對象的設計單純化,對客戶來說,他所要知道的是所使用的 Iterator而不是聚合對象的類型。<br>
</body>
</html>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -