zoukankan      html  css  js  c++  java
  • 用最简单的例子理解迭代器模式(Iterator Pattern)

    迭代器模式的需求来自:需要对一些集合进行迭代,而迭代的方式可能有很多种。

     

    说到迭代,动作大致包括设置第一个位置,获取下一个位置元素,判断是否迭代结束,获取当前位置元素,大致就这么些。把这些迭代动作封装到一个接口中。

        public interface IIterator
    
        {
    
            void First();
    
            string Next();
    
            bool IsDone();
    
            string Current();
    
        }

     

    在现实场景中,迭代的方式可能有很多种,先实现一种迭代方式,实现IIterator接口。

       public class IWannaIterate : IIterator
    
        {
    
            private List<string> _list;
    
            private int position;
    
            public IWannaIterate(List<string> list)
    
            {
    
                Console.WriteLine("我要感谢IIterator,有了它我才可以迭代");
    
                _list = list;
    
                position = 0;
    
            }
    
            public void First()
    
            {
    
                position = 0;
    
            }
    
            public string Next()
    
            {
    
                return _list[position++];
    
            }
    
            public bool IsDone()
    
            {
    
                return position >= _list.Count;
    
            }
    
            public string Current()
    
            {
    
                return _list[position];
    
            }
    
        }
    

     

    以上,迭代器IWannaIterate类内部维护这一个集合,而这个集合是通过构造函数赋值的,否则的话,迭代器就没活干了。  

     

    好了,迭代器,迭代的具体方式有了,迭代器给谁用呢?

     

    只要一个类维护着集合,就可能用到以上实现IIterator接口的某种具体迭代器。所有需要迭代器的类都有一个共同的动作,就是创建一个迭代器。先把创建迭代器的动作抽象成接口。

        public interface IManagement
    
        {
    
            IIterator CreateIterator();
    
        }

    假设有一个管理用户集合的类,使用以上的IWannaIterate迭代器。

        public class MyUserManagement : IManagement
    
        {
    
            private List<string> _users;
    
            public MyUserManagement()
    
            {
    
                _users = new List<string>();
    
                _users.Add("hello");
    
                _users.Add("world");
    
                _users.Add("nice");
    
            }
    
            public IIterator CreateIterator()
    
            {
    
                return new IWannaIterate(_users);
    
            }
    
        }
    

     

    假设有一个管理Book集合的类,也使用以上的IWannaIterate迭代器。

        public class MyBookManagement : IManagement
    
        {
    
            private List<string> _books;
    
            public MyBookManagement()
    
            {
    
                _books = new List<string>();
    
                _books.Add("美丽世界");
    
                _books.Add("你好吗");
    
            }
    
            public IIterator CreateIterator()
    
            {
    
                return new IWannaIterate(_books);
    
            }
    
        }    
    

    客户端让MyUserManagement和MyBookManagement创建各自的迭代器,然后使用迭代器把集合的所有元素打印出来。

        class Program
    
        {
    
            static void Main(string[] args)
    
            {
    
                IManagement magageA = new MyUserManagement();
    
                IManagement manageB = new MyBookManagement();
    
                IIterator iteratorA = magageA.CreateIterator();
    
                IIterator iteratorB = manageB.CreateIterator();
    
                Console.WriteLine("打印出的user列表");
    
                PrintList(iteratorA);
    
                Console.WriteLine();
    
                Console.WriteLine("打印出book列表");
    
                PrintList(iteratorB);
    
                Console.ReadKey();
    
            }
    
            private static void PrintList(IIterator iterator)
    
            {
    
                while (!iterator.IsDone())
    
                {
    
                    Console.WriteLine(iterator.Next());
    
                }
    
            }
    
        }      
    

    1

     

    总结:

    ● 创建迭代器接口
    ● 创建迭代器的实现,通过构造函数注入集合
    ● 返回迭代器的接口方法
    ● 维护着集合的类都有创建迭代器的方法
    ● 客户端创建维护着集合的类实例,让迭代器做事

  • 相关阅读:
    Python基础——for/while循环
    Python基础——条件判断
    Python基础——字符串
    Python基础——输出[print()]与输入[input()]
    Python编程软件的安装与使用——Windows、Linux和Mac
    Python数据结构之三——dict(字典)
    微信【跳一跳】 opencv视觉识别 + 物理外挂
    tensorflow安装: win10 + RTX2060 + tensorflow1.15.0+ cuda10.0 + VScode
    FreeRTOS 任务与调度器(2)
    FreeRTOS 任务与调度器(1)
  • 原文地址:https://www.cnblogs.com/darrenji/p/3960084.html
Copyright © 2011-2022 走看看