故事小美是小雪最好的朋友。有一天, 小美问小雪:“小雪,怎么你的手机短信这么多啊,是不是谈恋爱了?”,小雪笑了一下,说:“还没呢”,小雪停顿了一下,“可是喜欢我的男孩倒是很多,这些男孩都不错,眼都快花了”。小美想了想:“跟我说说这些男孩子,我帮你选一个最优秀的”。
果然,小美开始给小雪策划了一个钻石王老五大调查(遍历):
1) 年龄小于30大于35者出局;
2) 身高低于180cm者出局;
3) 无房者出局;
4) 无车者出局;
5) 年薪低于100万者出局。
迭代器模式(ITerator)的解决方案迭代器模式的意图:通过顺序遍历或逆序遍历等方式访问集合对象(List)中的各元素子对象(object)。一般来说,一个集合对象拥有两个职责:一是存储一组元素子对象;二是遍历集合中的各元素子对象。从依赖性来讲,前者是集合对象的根本属性;后者是可分离的变化点。
子对象接口如下:
namespaceXiaoXue
{
publicinterfaceIBoy
{
stringName{get;}
intGetAge();
intGetHeight();
boolHasHouse();
boolHasCar();
boolHasMillion();
}
}
子对象具体类如下:
namespaceXiaoXue
{
publicclassBoyA:IBoy
{
privatestring_Name="张三";
publicstringName
{
get{return_Name;}
}
publicintGetAge()
{
return25;
}
publicintGetHeight()
{
return187;
}
publicboolHasHouse()
{
returntrue;
}
publicboolHasCar()
{
returnfalse;
}
publicboolHasMillion()
{
returnfalse;
}
}
publicclassBoyB:IBoy
{
privatestring_Name="李四";
publicstringName
{
get{return_Name;}
}
publicintGetAge()
{
return32;
}
publicintGetHeight()
{
return170;
}
publicboolHasHouse()
{
returntrue;
}
publicboolHasCar()
{
returntrue;
}
publicboolHasMillion()
{
returntrue;
}
}
}
迭代器接口如下:
namespaceXiaoXue
{
publicinterfaceIListIterator
{
voidFirst();
voidLast();
boolMovePrevous();
boolMoveNext();
objectCurrent{get;}
}
}
迭代器如下:
namespaceXiaoXue
{
publicclassBoyList:IListIterator
{
privateList<IBoy>boys=null;//子对象列表
privateintindex=-1;
publicBoyList()
{
boys=newList<IBoy>();
}
//添加子对象
publicvoidAddBoy(IBoyboy)
{
boys.Add(boy);
}
publicvoidRemoveBoy(IBoyboy)
{
boys.Remove(boy);
index--;
}
publicvoidFirst()
{
index=0;
}
publicvoidLast()
{
index=boys.Count;
}
publicboolMovePrevious()
{
index--;
returnindex>-1;
}
publicboolMoveNext()
{
index++;
returnindex<boys.Count;
}
publicobjectCurrent
{
get{returnthis.boys[index];}
}
}
}
调用代码如下:
IListIteratoriterator=newBoyList();
iterator.AddBoy(newBoyA());
iterator.AddBoy(newBoyB());
while(iterator.MoveNext())
{
IBoyboy=(IBoy)iterator.Current
if(boy.GetAge()<30||boy.GetAge()>35)
{
iterator.RemoveBoy(boy);
}
elseif(boy.GetHeight()<180)
{
iterator.RemoveBoy(boy);
}
elseif(!boy.HasHouse())
{
iterator.RemoveBoy(boy);
}
elseif(!boy.HasCar())
{
iterator.RemoveBoy(boy);
}
elseif(!boy.HasMillion())
{
iterator.RemoveBoy(boy);
}
else
{
Console.WriteLine(boy.Name);
}
}
哈哈, 好象没有一个符合条件的,俗话说:“什么样的马配什么样的鞍”。这样的王老五只有到月球上去找吧!