当前位置:
首页 > Python基础教程 >
-
C#教程之使用C# (.NET Core) 实现迭代器设计模式 ((2)
public Hashtable MenuItems { get; } = new Hashtable();
public CafeMenu()
{
AddItem("Veggie Burger and Air Fries", "Veggie burger on a whole wheat bun, lettuce, tomato, and fries", true, 3.99);
AddItem("Soup of the day", "A cup of the soup of the day, with a side salad", false, 3.69);
AddItem("Burrito", "A large burrito, with whole pinto beans, salsa, guacamole", true, 4.29);
}
public IEnumerator CreateIEnumerator()
{
return MenuItems.GetEnumerator();
}
public void AddItem(string name, string description, bool vegetarian, double price)
{
var menuItem = new MenuItem(name, description, vegetarian, price);
MenuItems.Add(menuItem.Name, menuItem);
}
}
}
菜单的迭代器:
using System; using System.Collections; using IteratorPattern.Menus; namespace IteratorPattern.MenuIterators { public class DinerMenuIterator: IEnumerator { private readonly MenuItem[] _menuItems; private int _position = -1; public DinerMenuIterator(MenuItem[] menuItems) { _menuItems = menuItems; } public bool MoveNext() { _position++; if (_position >= _menuItems.Length || _menuItems[_position] == null) { return false; } return true; } public void Reset() { _position = -1; } public object Current => _menuItems[_position]; } }
using System.Collections; using System.Collections.Generic; namespace IteratorPattern.MenuIterators { public class PancakeHouseMenuIterator : IEnumerator { private readonly ArrayList _menuItems; private int _position = -1; public PancakeHouseMenuIterator(ArrayList menuItems) { _menuItems = menuItems; } public bool MoveNext() { _position++; if (_position >= _menuItems.Count || _menuItems[_position] == null) { return false; } return true; } public void Reset() { _position = -1; } public object Current => _menuItems[_position]; } }
服务员:
using System; using System.Collections; using IteratorPattern.Abstractions; using IteratorPattern.Menus; namespace IteratorPattern.Waitresses { public class Waitress { private readonly ArrayList _menus; public Waitress(ArrayList menus) { _menus = menus; } public void PrintMenu() { var menuIterator = _menus.GetEnumerator(); while (menuIterator.MoveNext()) { var menu = menuIterator.Current as IMenu; PrintMenu(menu?.CreateIEnumerator()); } } private void PrintMenu(IEnumerator iterator) { while (iterator.MoveNext()) { if (iterator.Current != null) { MenuItem menuItem; if (iterator.Current is MenuItem item) { menuItem = item; } else { menuItem = ((DictionaryEntry)iterator.Current).Value as MenuItem; } Console.Write($"{menuItem?.Name}, "); Console.Write($"{menuItem?.Price} -- "); Console.WriteLine($"{menuItem?.Description}"); } } Console.WriteLine(); } } }
测试:
static void MenuTestDriveUsingIEnumerator() { var pancakeHouseMenu = new PancakeHouseMenu(); var dinerMenu = new DinerMenu(); var cafeMenu = new CafeMenu(); var waitress = new Waitress(new ArrayList(3) { pancakeHouseMenu, dinerMenu, cafeMenu }); waitress.PrintMenu(); }
深入浅出设计模式的C#实现的代码: https://github.com/solenovex/Head-First-Design-Patterns-in-CSharp
这篇先到这, 本章涉及到组合模式, 下篇文章再写.
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式