Iterator Pattern
Summary: Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.
Sample Code
Code
public class Photo
{
public string Name { get; set; }
public Photo(string name)
{
this.Name = name;
}
}
public interface IPhotoCollection
{
IPhotoIterator CreateIterator();
}
public interface IPhotoIterator
{
Photo First();
Photo Next();
bool IsDone { get; }
Photo CurrentPhoto { get; }
}
public class PhotoCollection : IPhotoCollection
{
private ArrayList _items = new ArrayList();
public IPhotoIterator CreateIterator()
{
return new PhotoIterator(this);
}
public int Count
{
get { return _items.Count; }
}
public object this[int index]
{
get { return _items[index]; }
set { _items.Add(value); }
}
}
public class PhotoIterator : IPhotoIterator
{
private PhotoCollection _photos;
private int _current = 0;
private int _step = 1;
public Photo CurrentPhoto { get { return _photos[_current] as Photo; } }
public bool IsDone { get { return _current >= _photos.Count; } }
public PhotoIterator(PhotoCollection photos)
{
this._photos = photos;
}
public Photo First()
{
_current = 0;
return _photos[_current] as Photo;
}
public Photo Next()
{
_current += _step;
if (!IsDone)
return _photos[_current] as Photo;
else
return null;
}
}
Usage
PhotoCollection photoCollection = new PhotoCollection();
photoCollection[0] = new Photo("IMG_01");
photoCollection[1] = new Photo("IMG_02");
photoCollection[2] = new Photo("IMG_03");
photoCollection[3] = new Photo("IMG_04");
photoCollection[4] = new Photo("IMG_05");
photoCollection[5] = new Photo("IMG_06");
photoCollection[6] = new Photo("IMG_07");
photoCollection[7] = new Photo("IMG_08");
photoCollection[8] = new Photo("IMG_09");
PhotoIterator photoIterator = new PhotoIterator(photoCollection);
for (Photo p = photoIterator.First(); !photoIterator.IsDone; p = photoIterator.Next())
{
System.Console.WriteLine($"{p.Name}");
}
Output
IMG_01
IMG_02
IMG_03
IMG_04
IMG_05
IMG_06
IMG_07
IMG_08
IMG_09
Comments
Post a Comment