• C# 设计模式(17)迭代器模式


    迭代器模式

    1. Yield Return

    2. 提供统一的访问方式

    代码实现:

    食品类:

       public  class Food
        {
            public int Id { get; set; }
            public string Name { get; set; }
            public int Price { get; set; }
        }
    

    菜单类:

        public class KFCMenu
        {
            private readonly Food[] _foodArray = new Food[3];
    
            public KFCMenu()
            {
                _foodArray[0]= new Food()
                {
                    Id =01,
                    Name = "hamburger",
                    Price = 15
                };
                _foodArray[1] = new Food()
                {
                    Id = 02,
                    Name = "fries",
                    Price = 5
                };
                _foodArray[2] = new Food()
                {
                    Id = 03,
                    Name = "Cola",
                    Price = 10
                };
            }
    
            public Food[] GetFoods()
            {
                return _foodArray;
            }
        }
       public class MacDonaldMenu
        {
            private readonly List<Food> _foodArray = new List<Food>();
    
            public MacDonaldMenu()
            {
                _foodArray.Add(new Food()
                {
                    Id = 01,
                    Name = "ketchup",
                    Price = 10
                });
                _foodArray.Add(new Food()
                {
                    Id = 01,
                    Name = "big Mac",
                    Price = 20
                });
                _foodArray.Add(new Food()
                {
                    Id = 01,
                    Name = "Apple Pie",
                    Price = 15
                });
            }
    
            public List<Food> GetFoods()
            {
                return _foodArray;
            }
        }
    

    自定义迭代器:

    namespace IteratorPattern.Iterator
    {
        public interface IIterator
        {
            bool MoveNext();
    
            object Current { get; }
    
            void Reset();
        }
       public class KFCIterator:IIterator
        {
            private readonly KFCMenu _kfcMenu;
    
            public KFCIterator(KFCMenu kfcMenu)
            {
                _kfcMenu = kfcMenu;
            }
    
            private int _index = -1;
    
            public bool MoveNext()
            {
                return _kfcMenu.GetFoods().Length > (++_index);
            }
    
            public object Current => _kfcMenu.GetFoods()[_index];
    
            public void Reset()
            {
                _index = -1;
            }
        }
        public class MacDonaldIterator:IIterator
        {
            private readonly MacDonaldMenu _macDonaldMenu;
    
            public MacDonaldIterator(MacDonaldMenu macDonaldMenu)
            {
                _macDonaldMenu = macDonaldMenu;
            }
    
            private int _index = -1;
    
            public bool MoveNext()
            {
                return _macDonaldMenu.GetFoods().Count > (++_index);
            }
    
            public object Current => _macDonaldMenu.GetFoods()[_index];
    
            public void Reset()
            {
                _index = -1;
            }
        }
    }

    代码调用:

        class Program
        {
            static void Main(string[] args)
            {
                KFCMenu kfcMenu = new KFCMenu();
                //.NET Iterator
                Food[] kfcFoods = kfcMenu.GetFoods();
                foreach (var kfcFood in kfcFoods)
                {
                    Console.WriteLine($"KFC Menu include {kfcFood.Name},price is {kfcFood.Price} RMB.");
                }
    
                //Custom Iterator
                KFCIterator kfcIterator = new KFCIterator(kfcMenu);
                while (kfcIterator.MoveNext())
                {
                    Console.WriteLine(
                        $"Custom Iterator KFC Menu include {((Food) kfcIterator.Current).Name},price is {((Food) kfcIterator.Current).Price} RMB.");
                }
    
                MacDonaldMenu macDonaldMenu = new MacDonaldMenu();
                //.NET Iterator
                List<Food> macDonaldFoods = macDonaldMenu.GetFoods();
    
                foreach (var macDonaldFood in macDonaldFoods)
                {
                    Console.WriteLine($"MacDonald Menu include {macDonaldFood.Name},price is {macDonaldFood.Price} RMB.");
                }
    
                //Custom Iterator
                MacDonaldIterator macDonaldIterator = new MacDonaldIterator(macDonaldMenu);
                while (macDonaldIterator.MoveNext())
                {
                    Console.WriteLine(
                        $"Custom Iterator MacDonald Menu include {((Food) macDonaldIterator.Current).Name},price is {((Food) macDonaldIterator.Current).Price} RMB.");
                }
            }
        }

    结果:

  • 相关阅读:
    Atitit 提升开发进度大方法--高频功能与步骤的优化 类似性能优化
    Atitit 翻页功能的解决方案与版本历史 v4 r49
    Atitit.pagging  翻页功能解决方案专题 与 目录大纲 v3 r44.docx
    Atitit 视图参数解决方案 oracle版和mysql版本 attilax总结.docx
    Atitit easyui翻页组件与vue的集成解决方案attilax总结
    Atitit  技术经理职责与流程表总结
    Atitit 数据库视图与表的wrap与层级查询规范
    Atitit 手机图片备份解决方案attilax总结
    Atitit 提升进度的大原则与方法  高层方法  attilax总结
    Atiitt 使用java语言编写sql函数或存储过程
  • 原文地址:https://www.cnblogs.com/YourDirection/p/14097619.html
Copyright © 2020-2023  润新知