php 什么是迭代器,php的迭代器是什么

什么是迭代器模式

定义:提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部显示

下面是迭代器模式结构图:

965e9a93e3c4e4bf83d5467811fada10.png

下面的示例代码简单了解一下://抽象聚合类

abstract class Aggregate

{

public abstract Iterator CreateIterator();

}

//具体聚合类

class ConcreteAggregate : Aggregate

{

private IList items = new List();

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

}

}

//抽象迭代器类

abstract class Iterator

{

public abstract object First();

public abstract object Next();

public abstract bool IsDone();

public abstract object CurrentItem();

}

//具体迭代器类

class ConcreteIterator : Iterator

{

private ConcreteAggregate aggregate;

private int Current = 0;

public ConcreteIterator(ConcreteAggregate aggregate)

{

this.aggregate = aggregate;

}

public override object CurrentItem()

{

return aggregate[Current];

}

public override object First()

{

return aggregate[0];

}

public override bool IsDone()

{

return Current >= aggregate.Count ? true : false;

}

public override object Next()

{

object ret = null;

Current++;

if(Current

{

ret = aggregate[Current];

}

return ret;

}

}

static void Main(string[] args)

{

ConcreteAggregate aggregate = new ConcreteAggregate();

aggregate[0] = "michael";

aggregate[1] = "jarle";

aggregate[2] = "cumming";

aggregate[3] = "andy";

ConcreteIterator iterator = new ConcreteIterator(aggregate);

iterator.First(); while (!iterator.IsDone())

{

Console.WriteLine($"{iterator.CurrentItem()},请打卡后再下班");

iterator.Next();

}

Console.Read();

}

分析:想一下,如果把集合对象和对集合对象的操作放在一起,当我们想换一种方式遍历集合对象中元素时,就需要修改集合对象了,违背“单一职责原则”,而迭代器模式将数据结构和数据结构的算法分离开,两者可独立发展。

优点:

1.支持多种遍历方式。比如有序列表,我们根据需要提供正序遍历、倒序遍历两种迭代器。用户只需要得到我们的迭代器,就可以对集合执行遍历操作

2.简化了聚合类。由于引入了迭代器,原有的集合对象不需要自行遍历集合元素了

3.增加新的聚合类和迭代器类很方便,两个维度上可各自独立变化

4.为不同的集合结构提供一个统一的接口,从而支持同样的算法在不同的集合结构上操作

缺点:

1.迭代器模式将存储数据和遍历数据的职责分离增加新的集合对象时需要增加对应的迭代器类,类的个数成对增加,在一定程度上增加系统复杂度

使用场景:

1.访问一个聚合对象内容而无须暴露它的内部显示

2.需要为聚合对象提供多种遍历方式

3.为遍历不同的聚合结构提供一个统一的接口

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值