读书人

设计形式(4)迭代器模式

发布时间: 2013-03-06 16:20:31 作者: rapoo

设计模式(4)迭代器模式

概述
迭代器模式(Iterator):提供一种方法顺次访问聚合对象中各个元素,同时不暴露对象内部细节。

结构图


设计形式(4)迭代器模式

结构

迭代器抽象类(Iterator):负责定义访问和遍历元素的接口。

定义当前开始对象、得到下一个对象、得到下一个对象、判断是否结尾。将列表的访问和遍历从列表对象中分离,并放到迭代器对象(Iterator)中。


[csharp] view plaincopyprint?
  1. //迭代器抽象类
  2. abstract class Iterator
  3. {
  4. public abstract object First();
  5. public abstract object Next();
  6. public abstract object IsDone();
  7. public abstract object CurrentItem();
  8. }

具体迭代器(Concrete Iterator):实现迭代器接口,记录遍历中当前位置。

[csharp] view plaincopyprint?
  1. //具体迭代器类,继承Iterator
  2. class ConcreteIterator : Iterator
  3. {
  4. private ConcreteAggregate aggregate;
  5. private int current = 0;
  6. public ConcreteIterator(ConcreteAggregate aggregate)
  7. {
  8. this.aggregate = aggregate;
  9. }
  10. public override object First()
  11. {
  12. return aggregate [0];
  13. }
  14. public override object Next()
  15. {
  16. object ret = null;
  17. current++;
  18. if (current < aggregate.count)
  19. {
  20. ret = aggregate [current];
  21. }
  22. return ret;
  23. }
  24. public override bool IsDone()
  25. {
  26. return current >=aggregate .count ?true:false ;
  27. }
  28. public override object CurrentItem()
  29. {
  30. return aggregate [current ];
  31. }
  32. }

聚集抽象类(Aggregate):提供创建具体迭代器的接口。


[csharp] view plaincopyprint?
  1. //聚集抽象类
  2. abstract class Aggreate
  3. {
  4. public abstract Iterator CreateIterator();
  5. }


具体聚集类(ConcreteAggregate):存放聚合对象,返回聚集的个数并声明一个索引器。

[csharp] view plaincopyprint?
  1. //具体聚集类
  2. class ConcreteAggregate : Aggreate
  3. {
  4. private IList<object > items =new List <object >();
  5. public override Iterator CreateIterator()
  6. {
  7. return new ConcreteIterator(this );
  8. }
  9. public int count
  10. {
  11. get { return items.Count; }
  12. }
  13. public object this[int index]
  14. {
  15. get { return items[index]; }
  16. set { items.Insert(index, value); }
  17. }
  18. }

客户端
[csharp] view plaincopyprint?
  1. static void Main(string[] args)
  2. {
  3. ConcreteAggregate a = new ConcreteAggregate();
  4. a[0] = "persona";
  5. a[1] = "personb";
  6. Iterator i =new ConcreteIterator (a );
  7. object item = i.First();
  8. while (!i.IsDone())
  9. {
  10. Console.WriteLine("{0}请先买票!",i.CurrentItem ());
  11. i.Next();
  12. }
  13. Console.ReadLine();
  14. }

读书人网 >软件开发

热点推荐