Iterator Pattern, 即迭代器模式,它让使用者通过接口循环访问容器中的元素,且不用了解底层的实体。
加入我们现在想访问微信和Line的用户,且打印出相关信息。
如大家所知,微信和Line属于不同公司,因此对用户列表的设计也有所不同。
假设微信用了LinkedList,Line用了数组,要打印用户列表,就必须分别重新实现PrintLinkedList 和PrintArray。
如果提供这样的接口给用户,是很蛋疼的事情。
为了方便起见,可以选用迭代器模式。
迭代器模式广泛用在OO设计中,比如在Java的Collections,提供了迭代访问List,Set的方法。
一下是微信(Wechat)和Line的例子来说明这一设计方案。
设计迭代器接口:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Learning.iterator
{
public interface IIterator
{
string Next();
bool HasNext();
}
}
社交聊天迭代器接口:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Learning.iterator
{
public interface ISocialNetwork
{
IIterator CreateIterator();
}
}
微信和微信迭代器:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Learning.iterator
{
public class WechatIterator : IIterator
{
private LinkedList<string> users;
private int position;
public WechatIterator(Wechat facebook)
{
users = facebook.Users;
}
public string Next()
{
return users.ElementAt(position++);
}
public bool HasNext()
{
return position >= users.Count;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Learning.iterator
{
public class WechatIterator : IIterator
{
private LinkedList<string> users;
private int position;
public WechatIterator(Wechat facebook)
{
users = facebook.Users;
}
public string Next()
{
return users.ElementAt(position++);
}
public bool HasNext()
{
return position >= users.Count;
}
}
}
Line和Line 迭代器
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Learning.iterator
{
public class Line : ISocialNetwork
{
private string[] users;
public Line()
{
users = new[] { "kathy", "lori", "krist" };
}
public string[] Users { get { return users; } }
public IIterator CreateIterator()
{
return new LineIterator(this);
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Learning.iterator
{
public class LineIterator : IIterator
{
private string[] users;
private int position;
public LineIterator(Line twitter)
{
users = twitter.Users;
position = 0;
}
public string Next()
{
return users[position++];
}
public bool HasNext()
{
return position >= users.Length;
}
}
}
测试:
public static void PrintIterator(IIterator iterator)
{
while(! iterator.HasNext())
{
Console.WriteLine(iterator.Next());
}
}
static void Main(string[] args)
{
IIterator facebook = new Wechat().CreateIterator();
IIterator twitter = new Line().CreateIterator();
Console.WriteLine("Wechat users:");
PrintIterator(facebook);
Console.WriteLine("Line ussers:");
PrintIterator(twitter);
}
输出:
Wechat users:
jason
chris
Line ussers:
kathy
lori
krist