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

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

    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());
            }
        }
    }


总结:

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

用最简单的例子理解迭代器模式(Iterator Pattern)的更多相关文章

  1. 用最简单的例子理解备忘录模式(Memento Pattern)

    简单来说,备忘录模式就是支持回退操作.假设让一个Notepad支持回退操作,如何实现呢? 首先需要一个备忘录类. public class Memento { private string _msg; ...

  2. 用最简单的例子理解复合模式(Composite Pattern)

    在显示树形结构时,复合模式有很好的体现.本篇显示如下部门结构: 以上,有的节点包含子节点,有的节点部包含子节点.不管是什么节点,每个节点就代表一个部门. 首先设计一个关于部门的抽象基类. public ...

  3. 用最简单的例子理解命令模式(Command Pattern)

    假设想让遥控器控制电灯的开关.电视机的开关和切换,该如何做? 所有的开.关.切换都是遥控器发出的指令,把这些指令统一抽象成一个接口. public interface IControl { void ...

  4. 设计模式学习--迭代器模式(Iterator Pattern)和组合模式(Composite Pattern)

    设计模式学习--迭代器模式(Iterator Pattern) 概述 ——————————————————————————————————————————————————— 迭代器模式提供一种方法顺序 ...

  5. 设计模式系列之迭代器模式(Iterator Pattern)——遍历聚合对象中的元素

    模式概述 模式定义 模式结构图 模式伪代码 模式改进 模式应用 模式在JDK中的应用 模式在开源项目中的应用 模式总结 说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修 ...

  6. 设计模式(十):从电影院中认识"迭代器模式"(Iterator Pattern)

    上篇博客我们从醋溜土豆丝与清炒苦瓜中认识了“模板方法模式”,那么在今天这篇博客中我们要从电影院中来认识"迭代器模式"(Iterator Pattern).“迭代器模式”顾名思义就是 ...

  7. 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern)

    原文:乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern) 作者:weba ...

  8. 二十四种设计模式:迭代器模式(Iterator Pattern)

    迭代器模式(Iterator Pattern) 介绍提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示. 示例有一个Message实体类,某聚合对象内的各个元素均为该实体对象,现 ...

  9. 设计模式 - 迭代器模式(iterator pattern) 具体解释

    迭代器模式(iterator pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 迭代器模式(iterator pattern) : 提供一 ...

随机推荐

  1. c++实现二叉树的非递归创建以及非递归先序、中序、后序遍历

    二叉树的创建 思路:数组中从上到下依次放着二叉树中的元素,使用递归很容易实现,那么这里使用容器来存放之前的状态实现循环创建二叉树. TreeNode* createTree(int *arr, int ...

  2. 防止一个exe被打开多次

    mutex有一个名字,如果这个exe已经打开了,createNew返回的就是false,程序就退出了. 这是个wpf application的例子 protected override void On ...

  3. google浏览器打开新的标签页显示http://www.google.com.hk/url?sa=p&hl=zh-CN&……

    chrome的版本:51.0.2704.106 m使用该版本的chrome后,每次打开新标签页,都会提示“无法访问此网站”.并自动跳转到一个地址“http://www.google.com.hk/ur ...

  4. hdu 4788 (2013成都现场赛 H题)

    100MB=10^5KB=10^8B 100MB=100*2^10KB=100*2^20B Sample Input2100[MB]1[B] Sample OutputCase #1: 4.63%Ca ...

  5. 解决ASP.NET MVC(post数据)Json请求太大,无法反序列化(The JSON request was too large to be deserialized)

    这个问题出现的场景并不是很多,当你向服务端异步(ajax)post数据非常大的情况下(比如做权限管理的时候给某个角色分配权限那么就可能会出现,我所遇到的就是该角色大概200个模块每个模块平均2个功能- ...

  6. 【51nod】1565 模糊搜索

    题解 这个字符集很小,我们可以把每个字符拿出来做一次匹配,把第一个字符串处理每个出现过的该字符处理成一个区间加,即最后变成第一个字符串的该位置能够匹配某字符 例如对于样例 10 4 1 AGCAATT ...

  7. 修改linux下默认的python版本

    首先在终端输入:python --verison 查看本机默认采用的python 版本 接着进入/usr/local/lib 目录查看当前系统中安装了多少个python版本 如果只有一个,就安装你需要 ...

  8. lr11录制时报“Request Connection: Remote Server @ 0.0.0.0:1080 (Service=?) NOT PROXIED! )”解决方法

    在录制脚本的时候出现如下现象: 解决方法: LoadRunner录制脚本时出现:Unable to connect to remote server),有事件没有脚本的问题   1.首先要查看IE浏览 ...

  9. linux下文件转码

    一.工具介绍 enca是一个很好用的文件转码工具,使用命令 sudo apt-get install enca 即可安装 二.基本用法 1.查看文件编码 $ enca filename 2.文件转码 ...

  10. 让ORM支持多结果集

    在现有的ORM框架中,都支持查询单个结果集.比如查询用户表,传入语句,返回一个用户对象的集合.虽然一次性查询多个结果集的情况不多,而且也可以通过多次查询得到,但是从写框架的角度来说,我们并不清楚客户( ...