博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式之迭代器模式
阅读量:5300 次
发布时间:2019-06-14

本文共 3027 字,大约阅读时间需要 10 分钟。

GOF给出的定义为:提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节。

Iterator模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明的访问集合内部的数据。

 迭代器模式由以下角色组成:

  1) 迭代器角色(Iterator):迭代器角色负责定义访问和遍历元素的接口。
  2) 具体迭代器角色(Concrete Iterator):具体迭代器角色要实现迭代器接口,并要记录遍历中的当前位置。
  3) 容器角色(Container):容器角色负责提供创建具体迭代器角色的接口。
  4) 具体容器角色(Concrete Container):具体容器角色实现创建具体迭代器角色的接口——这个具体迭代器角色于该容器的结构相关。

.Net集合类中有大量该模式的实现。当然我们也可以自己实现Iterator模式,以下是个简单的例子:

using System;using System.Collections;public class Person{    public Person(string fName, string lName)    {        this.firstName = fName;        this.lastName = lName;    }    public string firstName;    public string lastName;}public class People : IEnumerable{    private Person[] _people;    public People(Person[] pArray)    {        _people = new Person[pArray.Length];        for (int i = 0; i < pArray.Length; i++)        {            _people[i] = pArray[i];        }    }    public IEnumerator GetEnumerator()    {        return new PeopleEnum(_people);    }}public class PeopleEnum : IEnumerator{    public Person[] _people;    // Enumerators are positioned before the first element    // until the first MoveNext() call.    int position = -1;    public PeopleEnum(Person[] list)    {        _people = list;    }    public bool MoveNext()    {        position++;        return (position < _people.Length);    }    public void Reset()    {        position = -1;    }    public object Current    {        get        {            try            {                return _people[position];            }            catch (IndexOutOfRangeException)            {                throw new InvalidOperationException();            }        }    }}class App{    static void Main()    {        Person[] peopleArray = new Person[3]        {            new Person("John", "Smith"),            new Person("Jim", "Johnson"),            new Person("Sue", "Rabon"),        };        People peopleList = new People(peopleArray);        foreach (Person p in peopleList)            Console.WriteLine(p.firstName + " " + p.lastName);    }}/* This code produces output similar to the following: *  * John Smith * Jim Johnson * Sue Rabon *  */

  在.NET2.0下面,由于有了yield return关键字,实现起来将更加的简单优雅。下面我们把刚才的例子在2.0下重新实现一遍:

public class Person    {        public Person(string fName, string lName)        {            this.firstName = fName;            this.lastName = lName;        }        public string firstName;        public string lastName;    }    public class People : IEnumerable    {        private Person[] _people;        public People(Person[] pArray)        {            _people = new Person[pArray.Length];            for (int i = 0; i < pArray.Length; i++)            {                _people[i] = pArray[i];            }        }        public IEnumerator GetEnumerator()        {            foreach (Person item in _people)            {                yield return item;            }        }    }

  关于yield return关键字的详解, 可以参考:

总之, 迭代器模式是为容器而生。

转载于:https://www.cnblogs.com/zhaojin/archive/2012/02/23/2364610.html

你可能感兴趣的文章
MySQL进阶12-- 数据类型介绍: 数值型/字符型/日期型-- 正负溢出保护/枚举型/set型/时间戳...
查看>>
[ACM_水题] UVA 12502 Three Families [2人干3人的活后分钱,水]
查看>>
ThreadLocal的理解
查看>>
你不知道的CSS
查看>>
HashMap深度解析(一)
查看>>
Java跨平台原理
查看>>
批梯度下降和随机梯度下降的区别和代码实现
查看>>
android常见错误与问题
查看>>
[Scala] 快学Scala A1L1
查看>>
[转]Oracle DB 使用快速恢复区
查看>>
特性属性 @property
查看>>
Jmeter跨线程组传递变量
查看>>
UOJ #225.排队
查看>>
MS SQL Server2012中的IIF函数
查看>>
判断3389端口是否开启
查看>>
LINQ 入门
查看>>
不变集合 NSSet
查看>>
标准C程序设计七---54
查看>>
《Linux命令行与shell脚本编程大全 第3版》高级Shell脚本编程---47
查看>>
Hibernate=====HQL实用技术
查看>>