有很多方法可以把对象堆起来成为一个集合。你可以把它们放进数组,堆栈,列表,或者是散列表中,这是你的自由。

     迭代器模式定义:提供一个方法顺序访问一个聚合对象中的各个元素,而又不暴露它内部的表示.迭代器模式把在元素之间的游走的责任交给迭代器,而不是聚合对象,这不仅让聚合的接口和实现变得更简洁,也可以让聚合更加专注在它所应该专注的事情上面,而不用去理会遍历的事情。

     迭代器类图:
老生常谈:迭代器模式
   
   现在引用《Head First》原文来说明迭代器模式的用法。

   原本两家餐厅都是有自己的菜单实现方法,对象村餐厅的菜单用数组实现,而煎饼物的则应用List<>来实现,现在合并了,毕然在菜单上实现方法上要有统一性.两家餐厅都同意这种做法,但是他们又不想改变自己菜单的实现方法,因为在他们各自的餐厅中都有很多地方依赖于自己菜单的实现方法.那么还能不能进行统一呢?答案是肯定的.他们有一个共同的特点:就是都是针对聚合对象操作,无论是散列表,堆栈,List<>,等等,两家菜单都要有遍历自己菜单的功能。这里都引入了迭代器模式。

   老生常谈:迭代器模式
   
   统一的迭代器接口:
   
老生常谈:迭代器模式public  interface Iterator<T>
    }
  
   这里用了泛型接口,因为返回的具体实例有不同。

   我们知道list<>和数组在做遍历操作的时候方法是不同的。要想实现两家餐厅菜单的统一,为此两家餐厅在菜单的实现上面可以通过面积接口编程来实现,不要通过具体实现。

   1: 对象村餐厅的迭代器:它是针对数组实现
  
老生常谈:迭代器模式public class DinerMenuIterator<T> : Iterator<BLL.IteratorTest.MenuItem>
   }
   
   2:煎饼店的迭代器:它是用List<>实现
  
老生常谈:迭代器模式public class PancakeHouseMenuIterator<T> : Iterator<BLL.IteratorTest.MenuItem>
    }
    
   1:对象村菜单实现:
   
老生常谈:迭代器模式public  class DinerMenu
    }
      
     2:煎饼店菜单实现:
   
老生常谈:迭代器模式public  class PancakeHouseMenu
    }
     
     3:菜单项具体内容:为了简化代码,在这就写了菜单项的名称,其它的省略了。
    
老生常谈:迭代器模式public  class MenuItem
    }
      
    4:服务员调用代码:有了菜单还得要有服务的服务,服务员的责任就是打印出来两家餐厅的所在菜单项供客人点餐。
    
老生常谈:迭代器模式public  class Waitress
    }
      
     5:client调用:简单的打印出了两家餐厅的所有菜单项的名称。
   
老生常谈:迭代器模式PancakeHouseMenu pancakeHouseMenu = new PancakeHouseMenu();
老生常谈:迭代器模式            DinerMenu dinerMenu 
= new DinerMenu();
老生常谈:迭代器模式            Waitress waitress 
= new Waitress(pancakeHouseMenu, dinerMenu);
老生常谈:迭代器模式            
string s = waitress.printMenu();
老生常谈:迭代器模式            
this.Label1.Text = s;
   
     总结:迭代器模式针对多种聚合对象操作的实现特别有帮助,可以将多种不同的聚合对象统一起来。

相关文章:

  • 2021-09-01
  • 2022-02-15
  • 2021-07-08
  • 2022-01-06
猜你喜欢
  • 2021-10-30
  • 2021-08-13
  • 2021-05-19
  • 2021-05-12
  • 2021-11-17
  • 2021-08-25
相关资源
相似解决方案