设为首页 加入收藏

TOP

设计模式-行为型-迭代器模式(一)
2019-10-09 19:58:50 】 浏览:102
Tags:设计模式 行为 模式

迭代器模式(Iterator):

  迭代器模式允许你访问一个数据项序列中的所有元素,而无须关心序列是什么类型(数组、链表、列表或任何其他类型)。它能有效地构建一个数据管道,经过一系列不同的转换或过滤后再从管道的另一端出来。迭代器模式就是提供一种遍历集合元素的统一接口,用一致的方法遍历集合元素,不需要知道集合对象的底层表示。

迭代器模式的角色:

    

  1)抽象迭代器(Iterator):接口声明了遍历集合所需的操作(获取下一个元素、获取当前位置和重新开始迭代等)。

  2)具体迭代器(ConcreteIterator):实现遍历集合的一种特定算法。迭代器对象必须跟踪自身遍历的进度。这使得多个迭代器可以相互独立地遍历同一个集合。

  3)抽象聚合(Aggregate):接口声明一个或多个方法来获取与集合兼容的迭代器。返回方法的类型必须被声明为迭代器接口。

  4)具体聚合(ConcreteAggregate):会在客户端请求迭代器时返回一个特定的具体迭代器类实体

  5)客户端(Client):通过集合和迭代器的接口与两者进行交互 这样一来客户端无需与具体类进行耦合 允许同一客户端代码使用各种不同的集合和迭代器

示例:

  先假设有两家餐厅,主营业务不同,一家是早餐店,一家是晚餐店。 

  1 /// <summary>
  2 /// 菜单明细项
  3 /// </summary>
  4 public class MenuItem
  5 {
  6     private string name;
  7     private string description;
  8     private bool vegetarin;
  9     private double price;
 10 
 11     public MenuItem(string name, string description, bool vegetarin, double price)
 12     {
 13         this.name = name;
 14         this.description = description;
 15         this.vegetarin = vegetarin;
 16         this.price = price;
 17     }
 18 
 19     public string GetName()
 20     {
 21         return this.name;
 22     }
 23 
 24     public double GetPrice()
 25     {
 26         return price;
 27     }
 28 
 29     public bool IsVegetarian()
 30     {
 31         return vegetarin;
 32     }
 33 
 34     public string GetDescription()
 35     {
 36         return description;
 37     }
 38 }
 39 
 40 /// <summary>
 41 /// 早餐菜单
 42 /// </summary>
 43 public class BreakfastMenu
 44 {
 45     private List<MenuItem> menuItems;
 46 
 47     public BreakfastMenu()
 48     {
 49         menuItems = new List<MenuItem>();
 50         AddItem("牛奶", "牛奶description", false, 3.0);
 51         AddItem("油条", "油条description", false, 1.0);
 52         AddItem("馒头", "馒头description", true, 1.0);
 53         AddItem("豆浆", "DoujiangDescription", true, 1.5);
 54     }
 55 
 56     public void AddItem(string name, string description, bool vegetarian, double price)
 57     {
 58         MenuItem menuItem = new MenuItem(name, description, vegetarian, price);
 59         menuItems.Add(menuItem);
 60     }
 61 
 62     public List<MenuItem> GetMenuItems()
 63     {
 64         return menuItems;
 65     }
 66 }
 67 
 68 /// <summary>
 69 /// 晚餐菜单
 70 /// </summary>
 71 public class DinnerMenu
 72 {
 73     private static readonly int Max_ITEMS = 6;
 74     private int numberOfItems = 0;
 75     private MenuItem[] menuItems;
 76 
 77     public DinnerMenu()
 78     {
 79         menuItems = new MenuItem[Max_ITEMS];
 80         AddItem("香菇豆腐饭", "香菇豆腐", false, 10.5);
 81         AddItem("蛋炒饭", "哈哈", false, 8.5);
 82         AddItem("鱼香肉丝", "你猜", true, 15.5);
 83     }
 84 
 85     public void AddItem(string name, string description, bool vegetarian, double price)
 86     {
 87         MenuItem menuItem = new MenuItem(name, description, vegetarian, price);
 88         if (numberOfItems > Max_ITEMS)
 89         {
 90             Console.WriteLine("菜单已满");
 91         }
 92         else
 93         {
 94             menuItems[numberOfItems] = menuItem;
 95             numberOfItems++;
 96         }
 97     }
 98 
 99     public MenuItem[] GetMenuItems()
100     {
101         return menuItems;
102     }
103 }

  现在两家合并了,服务员那菜单的时候就要拿两份菜单。

 1 public static void Main(string[] args)
 2 {
 3     BreakfastMenu breakfastMenu = new BreakfastMenu();
 4     List<MenuItem> breakfastItems = breakfastMenu.GetMenuItems();
 5 
 6     DinnerMenu dinerMenu = new DinnerMenu();
 7     MenuItem[] lunch
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇行为型设计模式(中) 下一篇微服务架构-利用事件驱动实现最终..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目