⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iteratorpattern.htm

📁 程式设计是思维具体化的一种方式
💻 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 &lt; 10; i++) <br>            arrayList.add("Test " + i);<br><br>        for(int i = 0; i &lt; 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 &lt; 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 &lt; 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 + -