熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

老生常談:迭代器模式

2022-06-13   來源: .NET編程 

     有很多方法可以把對象堆起來成為一個集合你可以把它們放進數組堆棧列表或者是散列表中這是你的自由

     迭代器模式定義:提供一個方法順序訪問一個聚合對象中的各個元素而又不暴露它內部的表示迭代器模式把在元素之間的游走的責任交給迭代器而不是聚合對象這不僅讓聚合的接口和實現變得更簡潔也可以讓聚合更加專注在它所應該專注的事情上面而不用去理會遍歷的事情

     迭代器類圖:

   
   現在引用《Head First》原文來說明迭代器模式的用法

   原本兩家餐廳都是有自己的菜單實現方法對象村餐廳的菜單用數組實現而煎餅物的則應用List<>來實現現在合並了畢然在菜單上實現方法上要有統一性兩家餐廳都同意這種做法但是他們又不想改變自己菜單的實現方法因為在他們各自的餐廳中都有很多地方依賴於自己菜單的實現方法那麼還能不能進行統一呢?答案是肯定的他們有一個共同的特點:就是都是針對聚合對象操作無論是散列表堆棧List<>等等兩家菜單都要有遍歷自己菜單的功能這裡都引入了迭代器模式

   
   
   統一的迭代器接口:
   
public  interface Iterator<T>
    {
        //判斷是否有下一個
        bool hasNext();
        //取得下一個菜單項
        T next();
    }  
   這裡用了泛型接口因為返回的具體實例有不同

   我們知道list<>和數組在做遍歷操作的時候方法是不同的要想實現兩家餐廳菜單的統一為此兩家餐廳在菜單的實現上面可以通過面積接口編程來實現不要通過具體實現

   : 對象村餐廳的迭代器它是針對數組實現
  
public class DinerMenuIterator<T> : Iterator<BLLIteratorTestMenuItem>
   {
        MenuItem[] items;
        int position = ;//當前位置
       //判斷是否有下一個
       public  bool hasNext()
       {
           if (position >= itemsLength || items[position] == null)
           {
               return false;
           }
           else
           {
               return true;         
           }     
       }
       //取得下一個菜單項
       public  MenuItem  next()
       {
           MenuItem menuItem = items[position];
           position += ;
           return menuItem;     
       }
       public DinerMenuIterator(MenuItem[] items)
       {
           ems = items;      
       }
   }   
   :煎餅店的迭代器:它是用List<>實現
  
public class PancakeHouseMenuIterator<T> : Iterator<BLLIteratorTestMenuItem>
    {
        List<MenuItem >  items;
        int position = ;//當前位置
       //判斷是否有下一個
       public  bool hasNext()
       {
           if (position >= itemsCount  || items[position] == null)
           {
               return false;
           }
           else
           {
               return true;        
           }      
       }
       //取得下一個菜單項
       public  MenuItem  next()
       {
           MenuItem menuItem = items[position];
           position += ;
           return menuItem;      
       }
       public PancakeHouseMenuIterator(List<MenuItem> items)
       {
           ems = items;      
       }
    }    
   :對象村菜單實現
   
public  class DinerMenu
    {
       MenuItem[] menuItems;
       public DinerMenu()
       {
           //菜單中最多放個菜單項
           menuItems = new MenuItem[];
           addItem(DinerMenu:eag);   
       }
       /**//// <summary>
       /// 增加菜單項
       /// </summary>
       /// <param name=name></param>
       public void addItem(string name)
       {
           MenuItem _menuItem = new MenuItem(name);
           //為了簡化代碼在這就加入一個菜單項
           menuItems[] = _menuItem;

       }
       public Iterator<MenuItem> createIterator()
       {
           return new DinerMenuIterator<MenuItem >(menuItems );       
       }
    }      
     :煎餅店菜單實現
   
public  class PancakeHouseMenu
    {
       List<MenuItem >  _menuItems;
       public PancakeHouseMenu()
       {
           addItem(PancakeHouseMenu:eag);    
       }
       /**//// <summary>
       /// 增加菜單項
       /// </summary>
       /// <param name=name></param>
       public void addItem(string name)
       {
           MenuItem _menuItem = new MenuItem(name);
           _menuItems = new List<MenuItem>(); 
           _menuItemsAdd(_menuItem);
       
       }
       public Iterator<MenuItem> createIterator()
       {
           return new PancakeHouseMenuIterator<MenuItem>(_menuItems);

       }
    }     
     菜單項具體內容:為了簡化代碼在這就寫了菜單項的名稱其它的省略了
    
public  class MenuItem
    {
       //菜單具體內容名稱
       string _name;
       public MenuItem(string name)
       {
           this_name = name;
       
       }
       /**//// <summary>
       /// 菜單項名稱
       /// </summary>
       public string name
       {
           get { return this_name; }
           set { this_name = value; }
       
       }
    }      
    服務員調用代碼有了菜單還得要有服務的服務服務員的責任就是打印出來兩家餐廳的所在菜單項供客人點餐
    
public  class Waitress
    {
       PancakeHouseMenu _PancakeHouseMenu;
       DinerMenu _DinerMenu;
       public Waitress(PancakeHouseMenu pancakeHouseMenu DinerMenu dinerMenu)
       {
           this_PancakeHouseMenu = pancakeHouseMenu;
           this_DinerMenu = dinerMenu;
       
       }
       /**//// <summary>
       /// 返回菜單項的內容
       /// </summary>
       /// <param name=iterator></param>
       /// <returns></returns>
       public  string printMenu(Iterator<MenuItem> iterator)
       {
           string sContent = ;
           while (iteratorhasNext())
           {
               MenuItem menuItem = (MenuItem)iteratornext();
               sContent += menuItemname+\n;         
           }
           return sContent;      
       }
       public string  printMenu()
       {
           //對象村餐廳菜單內容
           Iterator<MenuItem > dinerMenuIterator = _DinerMenucreateIterator();
           //對象村煎餅店餐廳菜單內容
           Iterator<MenuItem> pancakeHouseMenuIterator = _PancakeHouseMenu createIterator();
           string s = ;
           s +=對象村餐廳菜單內容:+printMenu(dinerMenuIterator)+\n;
           s += 對象村煎餅店餐廳菜單內容: + printMenu(pancakeHouseMenuIterator );
           return s;  
       }
    }      
     client調用簡單的打印出了兩家餐廳的所有菜單項的名稱
   
PancakeHouseMenu pancakeHouseMenu = new PancakeHouseMenu();
            DinerMenu dinerMenu = new DinerMenu();
            Waitress waitress = new Waitress(pancakeHouseMenu dinerMenu);
            string s = waitressprintMenu();
            thisLabelText = s;   
     總結迭代器模式針對多種聚合對象操作的實現特別有幫助可以將多種不同的聚合對象統一起來
From:http://tw.wingwit.com/Article/program/net/201311/13305.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.