常用的循环遍历数据方法---迭代器模式

咱们在C#项目开发过程中,经常使用foreach的方式来循环遍历某个聚合对象;可能已有很多人遗忘了它的工作原理;今天,我们从这里开始:实际上它是把已经聚集好的一个集合,我们不需要知道其实际的对象类型而循环读取数据;这个地方就用到了我们今天要讲的设计模式---迭代器模式;有兴趣的同学,可以下来了解一下IEumerator 和IEnumerable 接口。

什么是迭代器设计模式?提供一种方法顺序访问聚合对象中的各个元素,并又不暴露其内部表示。  也就是说,我们需要访问一个聚合对象的数据时候、需要对聚合对象采用不同的遍历方式的时候,就应该考虑迭代器模式来处理。这样的话,这种迭代器应该具有公有的访问开始、下一个、目前对象的数据、存在多少个对象、是否访问完成等方法。目前,JAVA、C# 等高级开发语言中已经 将对聚合对象的方法封装在一起了;我们使用动手开发类似的迭代器代码较少。所以我们今天仅讲其原理,方便以后备用。

代码部分如下:

//抽象迭代器,声明其方法
abstract class Iterator
{
   //这个地方为什么返回的是object对象呢,因为所有的类都是从Object类继续过来的
   //还有这个返回类型为object 是根据聚合对象 是什么类型而决定的
	public abstract object First();
	public abstract object Next();
	public abstract bool IsDone();
	public abstract object CurrentItem();
}
//一个具体的迭代器(ConcreteIterator)
class ConcreteIterator:Iterator
{
	//定义一个具体的聚合对象(这个具体对象必须有具体的类型)
	private ConcreteAggregate aggregate;
	private int current=0;
	//创建迭代器的时候,需要传入聚集对象
	public ConcreteIterator(ConcreteAggregate aggregate);
	{
		this.aggregate=aggregate;
	}
	public override void First()
	{
		return aggregate[0];
	}
	public override void 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];
	}
}
//聚合对象抽象类
abstract class Aggregate
{
    //创建一个迭代器
	public abstract Iterator CreateIterator();
}
//聚合对象具体类
class ConcreteAggregate: Aggregate
{
    //使用泛型定义个集合
	private List<object> items=new List<object>();
	public override Iterator CreateIterator()
	{
	    return new ConcreteAggregate(this);
	}
	public int Count
	{
		get{return items.Count;}
	}
	public object this[int index]
	{
		get{ return items[index];}
		set{ items.Insert(index,value);}
	}
}

客户端代码如下:

//客户端代码
ConcreteAggregate a=new ConcreteAggregate();
a[0]="合同工";
a[1]="临时工";
a[1]="公务员";
Iterator t=new ConcreteIterator(a);
object item=t.First();
while(!t.IsDone())
{
	Console.WriteLine("{0}发工资",t.CurrentItem());
	//读取下一个对象
	t.Next

如果咱咱们需要按照从后往前进行遍历,则只需重新冲Iterator类继承并重写里面的方法就OK了;是不是很简单。

时间: 2024-12-24 18:17:49

常用的循环遍历数据方法---迭代器模式的相关文章

jquery中object对象循环遍历的方法

一个朋友问对象如何转为数组,当我问他为啥要转得时候,他告诉我,数组可以用js循环遍历,而对象则不可以.其实呢,对象同样可以循环遍历的啊.不用转换也可以循环!说明你对js或者jquery的某些操作不是很熟练!在这里我简单介绍一下! 案例 我们看如下对象: ? 1 2 3 4 5 6 7 8 9 var data={   张三:69,   李四:72,   王五:90,   二麻子:88,   前端博客:100,   haorooms : 98,   王大壮:99 } 假如上面是后台返回的一个key

js中有哪些是循环遍历的方法?

1 each方法 jquery的方法,不能使用break打断循环,return falsed代表for循环中的break obj.each(function (i,item) { // i:循环的下标 // item:循环的节点 // $(this):jquery对象 // $(item):获得要循环的div的单个jquery对象 }) $.each(obj,function (i,item) { // i:下标 // item:循环的节点对象 // $(this):jquery对象 // $(

SQL查询遍历数据方法一 [ 临时表 + While循环]

以下以SQL Server 2000中的NorthWind数据库中的Customers表为例, 用 临时表 + While循环 的方法, 对Customers表中的CompanyName列进行遍历 create table #temp(  id int identity(1,1),  customer nvarchar(50)) declare @customer nvarchar(50)declare @n        intdeclare @rows     int select @n=1

几种遍历数据方法及性能

forEach() 数组中的每个元素都会通过forEach进行一些改变,会改变原数组. peoples.forEach(function (people) {  people.doSomething();}); map() 数组中的元素通过map进行一些改变后返回一个新数组,新数组中的元素都是原数组中的元素doSomething()后的结果,元素顺序一一对应.(return是必须的) var newPeoples = peoples.map(function (people) {  return

for 循环遍历数据动态渲染html

本案例通过ajax动态获取数据,然后遍历出数据渲染html小心踩坑:因为有时候不注意,渲染页面的时候只能输出最后一个数据所以正确写法为下:如果AJAX数据请求成功的情况下: html <div class="recommend-list"> <ul> <li> <div> <p class="recommend-h"></p> <p class="getTime">

struts s:iterator循环遍历数据 自动生成序号

如题:想自动生成序号:利用status参数即可. <s:iterator value="#session.Wbook_list" var="ib" status="status"> <tr align="center" class="list"> <td><input readonly="readonly" style="width:

Python进阶:设计模式之迭代器模式

在软件开发领域中,人们经常会用到这一个概念--"设计模式"(design pattern),它是一种针对软件设计的共性问题而提出的解决方案.在一本圣经级的书籍<设计模式:可复用面向对象软件的基础>(1991年,Design Patterns - Elements of Reusable Object-Oriented Software)中,它提出了23种设计模式.迭代器模式就是其中的一种,在各种编程语言中都得到了广泛的应用. 本文将谈谈 Python 中的迭代器模式,主要内

行为型模式之迭代器模式

概述 在软件开发中,我们经常需要使用聚合对象来存储一系列数据.聚合对象拥有两个职责:一是存储数据:二是遍历数据.从依赖性来看,前者是聚合对象的基本职责:而后者既是可变化的,又是可分离的.因此,可以将遍历数据的行为从聚合对象中分离出来,封装在一个被称之为“迭代器”的对象中,由迭代器来提供遍历聚合对象内部数据的行为,这将简化聚合对象的设计,更符合“单一职责原则”的要求. 定义 迭代器模式(Iterator Pattern):提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标(Cu

【设计模式】——迭代器模式

迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示.当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,或者你需要对聚集有多种方式遍历时,你就应该考虑用迭代器模式,为遍历不同的聚集结构提供如开始.下一个.是否结束.当前哪一项等统一接口. #include <iostream> #include <vector> using namespace std; typedef string object; //Iterato