迭代器模式(Iterator)
来源:互联网 发布:黑莓软件商店 编辑:程序博客网 时间:2024/04/30 08:23
迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。
当你需要访问一个聚合对象,而且不管这些对象是什么都需要遍历的时候,就应该考虑使用迭代器模式。另外,当需要对聚集有多种方式遍历时,可以考虑去使用迭代器模式。迭代器模式为遍历不同的聚集结构提供如开始、下一个、是否结束、当前哪一项等统一的接口。
迭代器模式UML类图:
迭代器模式实现:
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace Iterator{ /*Iterator迭代器抽象类*/ abstract class Iterator { public abstract object First(); public abstract object Next(); public abstract object CurrentItem(); public abstract bool IsDone(); } /*Aggregate聚集抽象类*/ abstract class Aggregate { public abstract Iterator createIterator(); } class ConcreteIterator : Iterator { // 定义了一个具体聚集对象 private ConcreteAggregate aggregate; private int current = 0; // 初始化对象将具体聚集类传入 public ConcreteIterator(ConcreteAggregate aggregate) { this.aggregate = aggregate; } // 第一个对象 public override object First() { return aggregate[0]; } // 得到聚集的下一对象 public override object Next() { object ret = null; current++; if (current < aggregate.Count) { ret = aggregate[current]; } return ret; } // 是否到结尾 public override bool IsDone() { return current >= aggregate.Count ? true : false; } // 返回当前聚集对象 public override object CurrentItem() { return aggregate[current]; } } class ConcreteAggregate : Aggregate { private IList<object> items = new List<object>(); public override Iterator createIterator() { return new ConcreteIterator(this); } // 返回聚集总个数 public int Count { get { return items.Count; } } // 声明一个索引器 public object this[int index] { get { return items[index]; } set { items.Insert(index, value); } } }}客户端:
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace Iterator{ class Program { static void Main(string[] args) { ConcreteAggregate ca = new ConcreteAggregate(); ca[0] = "大鸟"; ca[1] = "小菜"; ca[2] = "行李"; ca[3] = "老外"; ca[4] = "公交内部员工"; ca[5] = "小偷"; Iterator i = new ConcreteIterator(ca); object obj = i.First(); while (!i.IsDone()) { Console.WriteLine("{0} 请买车票!",i.CurrentItem()); i.Next(); } Console.Read(); } }}运行结果:
.NET的迭代器实现:
其实.net框架已经准备好了迭代器接口,只需要实现接口就行了IEumerator 支持对非泛型集合的简单迭代。
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace Iterator.Net{ public interface IEumerator { object Current { get; } bool MoveNext(); void Reset(); } public interface IEnumerable { IEnumerable GetEnumerator(); }}
客户端:
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace Iterator.Net{ class Program { static void Main(string[] args) { IList<string> ca = new List<string>(); ca.Add("大鸟"); ca.Add("小菜"); ca.Add("行李"); ca.Add("老外"); ca.Add("公交内部员工"); ca.Add("小偷"); foreach (string item in ca) { Console.WriteLine("{0} 请买车票!",item); } Console.Read(); } }}
运行结果:
迭代器模式总结:
迭代器模式(Iterator)就是分离了聚合对象的遍历行为,抽象出一个迭代器来负责这样既可以做到不暴露集合的内部结构,又可让外部代码透明的访问集合内部数据。
- 迭代器模式(Iterator)
- 迭代器模式(Iterator)
- 迭代器模式(Iterator)
- Iterator(迭代器)模式
- 迭代器模式(Iterator)
- 迭代器(Iterator)模式
- 迭代器模式(Iterator)
- Iterator(迭代器模式)
- 迭代器模式(Iterator)
- 迭代器模式(Iterator)
- 迭代器模式(Iterator)
- 迭代器模式(Iterator)
- 迭代器模式(Iterator)
- 迭代器模式(Iterator)
- 迭代器模式(Iterator)
- 迭代器模式(Iterator)
- 迭代器模式(Iterator)
- 迭代器模式(Iterator)
- 千头万绪不知从何说起
- POCO C++库学习和分析 -- 线程 (一)
- Linux下的Memcache安装方法
- How to Fix compstui.dll Error
- .NET中事务的隔离级别
- 迭代器模式(Iterator)
- CE下基于Zylonite硬件平台的SD卡驱动开发
- git cherry-pick + commit id 单独merge 任意一个branch的任意一个commit到本branch上
- 显示无法删除nul,参数不正确 的解决之道
- maven pom.xml详解
- [HTML] 使用HTML5的本地存储localStorage
- linux调度器(一)——概述
- 0001
- Codeforces Beta Round #54 (Div. 2)——B