<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    回歸

    驀然回首,那人卻在燈火闌珊處

      BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
      4 Posts :: 2 Stories :: 12 Comments :: 0 Trackbacks

     

             前些時(shí)工作忙,中間停頓一段時(shí)間,今天繼續(xù)。向關(guān)注這里的文章的博友們表示抱歉。
             今天說(shuō)說(shuō)一個(gè)簡(jiǎn)單的模式,迭代器模式(Iterator),他屬于行為模式中的一種。

             [形成]

             在Java程序中,在輸出List類型的對(duì)象時(shí)候,出現(xiàn)最多的程式塊就是:
             

    1     for (int i = 0 ;i<list.size; i++){
    2         XXX x = (XXX)list.get(i);
    3     }

     

    其中l(wèi)ist 是List 類型,里邊放著若干個(gè)XXX類型的對(duì)象。
    這種 方式是采用i++遞增的方式來(lái)遍歷list中的所有對(duì)象來(lái)進(jìn)行相關(guān)操作。對(duì)于設(shè)計(jì)模式,把i的功能抽象劃的結(jié)果就是:Iterator Pattern

    Iterate 中文的意思是“迭代,反復(fù)”,Iterator 的意思可以理解為“迭代器”。

           [代碼示例]
            示例程式是把書(Book)放到書架上(BookShelf)上,并依次輸出書名。
             
             程式列表
       
    名稱 說(shuō)明
    Aggregate 表示已聚合的接口
    Iterator 執(zhí)行遞增,遍歷的接口
    Book 表示書籍的類
    BookShelf 表示書架的類
    BookShelfIterator 掃描書架的類
    Main 測(cè)試用的類

       
              










    [UML圖]






          [示例代碼和類的詮釋]

    1 package Iterator;
    2 
    3 import java.util.Iterator;
    4 
    5 public interface Aggregate {
    6     public abstract Iterator iterator();
    7 }
    8 

    Aggregate 接口:
         該接口只聲明了一個(gè)方法,建立一個(gè)可以對(duì)應(yīng)聚合的Iterator.,當(dāng)需要遍歷某個(gè)聚合對(duì)象時(shí),調(diào)用Iterator方法可以建立一個(gè)實(shí)現(xiàn)Iterator接口的類的對(duì)象實(shí)例。

    1 package Iterator;
    2 
    3 public interface Iterator {
    4     public abstract boolean hasNext();
    5     public abstract Object next();
    6 }
    7 

    Iterator 接口:
    這是該模式的核心接口,Iterator接口執(zhí)行元素的遞增,具有循環(huán)遍歷的功能。Iterator的接口的方法因需要而定,我們可以初步確定接口方法:
    hasNext() :是檢查有沒有“下一個(gè)元素”,返回boolean.(有,返回true,,無(wú),返回false)
    next();取得“下一個(gè)元素”,同時(shí)把取對(duì)象的指針指向下一個(gè)元素,以便下次調(diào)用next方法的時(shí)候確實(shí)能取到下一個(gè)元素。這些具體實(shí)現(xiàn)還得看具體的實(shí)現(xiàn)Iterator接口的類的實(shí)現(xiàn)才知道

     1 package Iterator;
     2 
     3 public class Book {
     4     private String name = "";
     5 
     6     public Book(String name) {
     7         this.name = name;
     8     }
     9 
    10     public String getName() {
    11         return name;
    12     }
    13 }
    14 

    Book 類:
    表示書籍的類,比較簡(jiǎn)單,通過(guò)getName方法得到書的名字,書名是以構(gòu)造函數(shù)初始化對(duì)象的時(shí)候用參數(shù)來(lái)字號(hào)定。


     1 package Iterator;
     2 
     3 public class BookShelf implements Aggregate{
     4     private Book[] books;
     5     private int last = 0;
     6     
     7     public BookShelf(int maxsize){
     8         this.books = new Book[maxsize];
     9     }
    10         
    11     public Book getBookAt(int index){
    12         return books[index];
    13     }
    14     public void appendBook(Book book){
    15         this.books[last] = book;
    16         last++;
    17     }
    18     
    19     public int getLength(){
    20         return last;
    21     }
    22     public Iterator iterator(){
    23         return new BookShelfIterator(this);
    24     }
    25 }
    26 


    BookShelfl類:
         該類是表現(xiàn)書架作用的類,保證實(shí)現(xiàn)Aggregate接口所聲明的Iterator方法里返回實(shí)現(xiàn)Iterator接口的實(shí)例。如果需要遍歷書架上的書,調(diào)用iterator方法。books數(shù)組存放的對(duì)象就是book,書架大小可以在一開始建立時(shí)設(shè)置大小,當(dāng)然我們可以不用數(shù)組而采用java.util.Vector,就可以往書架上放超過(guò)指定數(shù)量的書籍。


     1 package Iterator;
     2 
     3 public class BookShelfIterator implements Iterator{
     4     private BookShelf bookShelf;
     5     private int index;
     6     public BookShelfIterator(BookShelf bookShelf){
     7         this.bookShelf = bookShelf;
     8         this.index =0;
     9     }
    10     
    11     public boolean hasNext(){
    12         if(index < bookShelf.getLength()){
    13             return true;
    14         }else{
    15             return false;
    16         }
    17     }
    18     
    19     public Object next(){
    20         Book book = bookShelf.getBookAt(index);
    21         index++;
    22         return book;
    23     }
    24 
    25 }
    26 

    BookShelfIterator類:

          字段bookShelf指定BookShelfIterator所要掃描的書架,而index字段則是指向目前該書的下標(biāo)。
          構(gòu)造函數(shù)把傳過(guò)來(lái)的BookShelf對(duì)象實(shí)例儲(chǔ)存在bookShelf字段,將index設(shè)置為0.
          實(shí)現(xiàn)的hasNext方法判斷是否有下一本書的標(biāo)準(zhǔn)是根據(jù)index是否小于書架上書籍的數(shù)量(表達(dá)式bookShelf.getLength()的值)來(lái)判斷。
          next方法返回目前該書,并進(jìn)入到“下一個(gè)”。兩步:第一步先把取得當(dāng)面的書籍保留在book變量,然后把循環(huán)變量推到“下一個(gè)”。


     1 package Iterator;
     2 
     3 public class Main {
     4     /**
     5      * @param args
     6      */
     7     public static void main(String[] args) {
     8         BookShelf bookShelf = new BookShelf(3);
     9         bookShelf.appendBook(new Book("book1"));
    10         bookShelf.appendBook(new Book("book2"));
    11         bookShelf.appendBook(new Book("book3"));
    12         Iterator it  = bookShelf.iterator();
    13         while(it.hasNext()){
    14             Book book = (Book)it.next();
    15             System.out.println(" "+book.getName());
    16         }
    17     }
    18 
    19 }
    20 

    Main類:
         1.先放三本書上架
          2.通過(guò)調(diào)用書架的iterator方法得到迭代器,來(lái)進(jìn)行循環(huán)遍歷
          3.循環(huán)遍歷書籍,取出書,打印出書的名字。


    示例程序的執(zhí)行結(jié)果 book1
     book2
     book3

    回顧一下,在迭代器模式中幾個(gè)重要“角色”:
         迭代器: 定義了訪問(wèn)和遍歷元素的接口 ,它定義了能否取得下一個(gè)元素信息的的hasNext方法和取得下一個(gè)元素的next方法
        具體的迭代器:實(shí)現(xiàn)了迭代器的接口,如本例的BookShelfIterator,掌握遍歷時(shí)的重要信息。
        聚合:定義了建立了Iterator的接口。如本例的:Aggregate接口,定義了Iterator方法
       具體聚合:實(shí)現(xiàn)了聚合的所定義的接口,如本例的BookShelf,它實(shí)現(xiàn)了Iterator方法。


          [拓展思考]
           有人回想,干嘛搞這么麻煩,用一個(gè)for不就是可以遍歷數(shù)組或List碼?思考一下迭代器的結(jié)構(gòu)。Iterator是把定義和實(shí)現(xiàn)分開

            while(it.hasNext()){
                               Book book = (Book)it.next();
                            System.out.println(" "+book.getName());
              }
          這里我只調(diào)用了Iterator接口的hasNext和next方法,并沒有調(diào)用BookShelf實(shí)現(xiàn)遍歷是需要的方法,如:getBookAt()。這里的while不會(huì)收到BookShelf的實(shí)現(xiàn)影響。
          假設(shè)這里我們不采用數(shù)組來(lái)管理BookShelf,而采取與Java.util.Vector來(lái)管理。無(wú)論BookShelf的如何修改,都Main測(cè)試程序里無(wú)需修改任何程序就可以運(yùn)行,這就是設(shè)計(jì)模式的優(yōu)勢(shì)。設(shè)計(jì)模式是為了提高類的服用率,如果把一個(gè)零件修改了,就不想要修改其他使用了改零件的部分。

     
    posted on 2007-07-27 15:22 回歸 閱讀(1183) 評(píng)論(2)  編輯  收藏

    Feedback

    # re: 親密接觸設(shè)計(jì)模式(三)-------Iterator(迭代器) 2007-07-27 17:33 pass86
    容器的運(yùn)用是很好的,省事。  回復(fù)  更多評(píng)論
      

    # re: 親密接觸設(shè)計(jì)模式(三)-------Iterator(迭代器) 2007-07-28 00:30 hh
    寫得很好!繼續(xù)??!  回復(fù)  更多評(píng)論
      


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 岛国岛国免费V片在线观看| 84pao强力永久免费高清| MM131亚洲国产美女久久| 国产99视频精品免费专区| 亚洲午夜电影在线观看| 免费一级毛片一级毛片aa| 黄色免费在线网站| jiz zz在亚洲| 久久精品国产精品亚洲艾| 狠狠久久永久免费观看| 免费无码作爱视频| 亚洲AV无码专区国产乱码不卡| 亚洲欧洲自拍拍偷精品 美利坚 | 亚洲成AV人片在线观看无| 性做久久久久久免费观看| 中国一级特黄高清免费的大片中国一级黄色片 | 亚洲av高清在线观看一区二区| 无码精品人妻一区二区三区免费看 | 91免费福利精品国产| 丰满亚洲大尺度无码无码专线 | 亚洲AV无码一区二区乱孑伦AS| 国产美女做a免费视频软件| 久久福利青草精品资源站免费| 亚洲小说图区综合在线| 亚洲AV日韩精品久久久久| 免费a级毛片在线观看| 在线看片无码永久免费视频| 一区二区三区在线免费观看视频| 亚洲五月综合缴情婷婷| 亚洲AV无码成人精品区蜜桃| 亚洲AV无码一区二三区| 啦啦啦中文在线观看电视剧免费版 | 亚洲国产成人精品无码区花野真一| 亚洲成色在线综合网站| 亚洲片国产一区一级在线观看| 成人啪精品视频免费网站| 久久精品免费电影| 中文无码日韩欧免费视频| 18禁亚洲深夜福利人口| 亚洲一卡2卡4卡5卡6卡残暴在线| 亚洲大成色www永久网站|