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

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

    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. Python基础 - 正则表达式

    Python自带正则表达式模块,即re模块. 导入正则模块: import re 用dir()函数查看re模块内的属性和方法: dir(re)

  2. Springboot + Vue + shiro 实现前后端分离、权限控制

    本文总结自实习中对项目对重构.原先项目采用Springboot+freemarker模版,开发过程中觉得前端逻辑写的实在恶心,后端Controller层还必须返回Freemarker模版的ModelA ...

  3. (一)问候 HtmlUnit

    第一节: HtmlUnit 简介 htmlunit 是一款开源的java 页面分析工具,读取页面后,可以有效的使用htmlunit分析页面上的内容.项目可以模拟浏览器运行,被誉为java浏览器的开源实 ...

  4. Java输出文件到本地(输出流)

    package cn.buaa; import java.io.File; import java.io.FileOutputStream; import java.io.FileWriter; im ...

  5. HA下的Spark集群工作原理解密

    实验环境: zookeeper-3.4.6 Spark:1.6.0 简介: 本篇博客将从以下几点组织文章: 一:Spark 构建高可用HA架构 二:动手实战构建高可用HA 三:提交程序测试HA 一:S ...

  6. .NETCore分布式微服务站点设计(1)-概念图

    自己画了一个简略结构图,准备按照这个搭建一套微服务型的站点 利用Identityserver4+Redis+Sqlserver+Swagger+阿里云OSS+RabbitMQ+Nginx来实现,按照自 ...

  7. Rookey.Frame之实体表单验证

    昨天给大家介绍了实体FluentValidation验证,今天继续给大家介绍表单验证,在Rookey.Frame框架中,表单验证有PrimaryKeyFields字段验证.唯一验证.必填验证.常用验证 ...

  8. [leetcode tree]102. Binary Tree Level Order Traversal

    Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...

  9. Xshell6和Xftp下载地址,rzsz的使用

    官方下载地址:https://cdn.netsarang.net/98f59c09/Xshell-6.0.0076r_beta.exe https://cdn.netsarang.net/98f59c ...

  10. BZOJ.2339.[HNOI2011]卡农(思路 DP 组合 容斥)

    题目链接 \(Description\) 有\(n\)个数,用其中的某些数构成集合,求构造出\(m\)个互不相同且非空的集合(\(m\)个集合无序),并满足每个数总共出现的次数为偶数的方案数. \(S ...