用最简单的例子理解迭代器模式(Iterator Pattern)
迭代器模式的需求来自:需要对一些集合进行迭代,而迭代的方式可能有很多种。
说到迭代,动作大致包括设置第一个位置,获取下一个位置元素,判断是否迭代结束,获取当前位置元素,大致就这么些。把这些迭代动作封装到一个接口中。
public interface IIterator{void First();
string Next();
bool IsDone();
string Current();
}
在现实场景中,迭代的方式可能有很多种,先实现一种迭代方式,实现IIterator接口。
public class IWannaIterate : IIterator{private List<string> _list;private int position;public IWannaIterate(List<string> list){Console.WriteLine("我要感谢IIterator,有了它我才可以迭代");
_list = list;position = 0;}public void First(){position = 0;}public string Next(){return _list[position++];
}public bool IsDone(){return position >= _list.Count;
}public string Current(){return _list[position];
}}
以上,迭代器IWannaIterate类内部维护这一个集合,而这个集合是通过构造函数赋值的,否则的话,迭代器就没活干了。
好了,迭代器,迭代的具体方式有了,迭代器给谁用呢?
只要一个类维护着集合,就可能用到以上实现IIterator接口的某种具体迭代器。所有需要迭代器的类都有一个共同的动作,就是创建一个迭代器。先把创建迭代器的动作抽象成接口。
public interface IManagement{IIterator CreateIterator();}
假设有一个管理用户集合的类,使用以上的IWannaIterate迭代器。
public class MyUserManagement : IManagement{private List<string> _users;public MyUserManagement()
{_users = new List<string>();_users.Add("hello");
_users.Add("world");
_users.Add("nice");
}public IIterator CreateIterator()
{return new IWannaIterate(_users);}}
假设有一个管理Book集合的类,也使用以上的IWannaIterate迭代器。
public class MyBookManagement : IManagement{private List<string> _books;public MyBookManagement()
{_books = new List<string>();_books.Add("美丽世界");
_books.Add("你好吗");
}public IIterator CreateIterator()
{return new IWannaIterate(_books);}}
客户端让MyUserManagement和MyBookManagement创建各自的迭代器,然后使用迭代器把集合的所有元素打印出来。
class Program
{static void Main(string[] args){IManagement magageA = new MyUserManagement();
IManagement manageB = new MyBookManagement();
IIterator iteratorA = magageA.CreateIterator();IIterator iteratorB = manageB.CreateIterator();Console.WriteLine("打印出的user列表");
PrintList(iteratorA);Console.WriteLine();Console.WriteLine("打印出book列表");
PrintList(iteratorB);Console.ReadKey();}private static void PrintList(IIterator iterator){while (!iterator.IsDone())
{Console.WriteLine(iterator.Next());}}}
总结:
● 创建迭代器接口
● 创建迭代器的实现,通过构造函数注入集合
● 返回迭代器的接口方法
● 维护着集合的类都有创建迭代器的方法
● 客户端创建维护着集合的类实例,让迭代器做事