电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

老生常谈:迭代器模式


发布日期:2021/11/21
 

有很多方法可以把对象堆起来成为一个集合你可以把它们放进数组堆栈列表或者是散列表中这是你的自由

迭代器模式定义:提供一个方法顺序访问一个聚合对象中的各个元素而又不暴露它内部的表示迭代器模式把在元素之间的游走的责任交给迭代器而不是聚合对象这不仅让聚合的接口和实现变得更简洁也可以让聚合更加专注在它所应该专注的事情上面而不用去理会遍历的事情

迭代器类图:

现在引用《Head First》原文来说明迭代器模式的用法

原本两家餐厅都是有自己的菜单实现方法对象村餐厅的菜单用数组实现而煎饼物的则应用List<>来实现现在合并了毕然在菜单上实现方法上要有统一性两家餐厅都同意这种做法但是他们又不想改变自己菜单的实现方法因为在他们各自的餐厅中都有很多地方依赖于自己菜单的实现方法那么还能不能进行统一呢?答案是肯定的他们有一个共同的特点:就是都是针对聚合对象操作无论是散列表堆栈List<>等等两家菜单都要有遍历自己菜单的功能这里都引入了迭代器模式

统一的迭代器接口:

publicinterfaceIterator<T>

{

//判断是否有下一个

boolhasNext();

//取得下一个菜单项

Tnext();

}

这里用了泛型接口因为返回的具体实例有不同

我们知道list<>和数组在做遍历操作的时候方法是不同的要想实现两家餐厅菜单的统一为此两家餐厅在菜单的实现上面可以通过面积接口编程来实现不要通过具体实现

: 对象村餐厅的迭代器它是针对数组实现

publicclassDinerMenuIterator<T>:Iterator<BLLIteratorTestMenuItem>

{

MenuItem[]items;

intposition=;//当前位置

//判断是否有下一个

publicboolhasNext()

{

if(position>=itemsLength||items[position]==null)

{

returnfalse;

}

else

{

returntrue;

}

}

//取得下一个菜单项

publicMenuItemnext()

{

MenuItemmenuItem=items[position];

position+=;

returnmenuItem;

}

publicDinerMenuIterator(MenuItem[]items)

{

ems=items;

}

}

:煎饼店的迭代器:它是用List<>实现

publicclassPancakeHouseMenuIterator<T>:Iterator<BLLIteratorTestMenuItem>

{

List<MenuItem>items;

intposition=;//当前位置

//判断是否有下一个

publicboolhasNext()

{

if(position>=itemsCount||items[position]==null)

{

returnfalse;

}

else

{

returntrue;

}

}

//取得下一个菜单项

publicMenuItemnext()

{

MenuItemmenuItem=items[position];

position+=;

returnmenuItem;

}

publicPancakeHouseMenuIterator(List<MenuItem>items)

{

ems=items;

}

}

:对象村菜单实现

publicclassDinerMenu

{

MenuItem[]menuItems;

publicDinerMenu()

{

//菜单中最多放个菜单项

menuItems=newMenuItem[];

addItem(DinerMenu:eag);

}

/**////<summary>

///增加菜单项

///</summary>

///<paramname=name></param>

publicvoidaddItem(stringname)

{

MenuItem_menuItem=newMenuItem(name);

//为了简化代码在这就加入一个菜单项

menuItems[]=_menuItem;

}

publicIterator<MenuItem>createIterator()

{

returnnewDinerMenuIterator<MenuItem>(menuItems);

}

}

:煎饼店菜单实现

publicclassPancakeHouseMenu

{

List<MenuItem>_menuItems;

publicPancakeHouseMenu()

{

addItem(PancakeHouseMenu:eag);

}

/**////<summary>

///增加菜单项

///</summary>

///<paramname=name></param>

publicvoidaddItem(stringname)

{

MenuItem_menuItem=newMenuItem(name);

_menuItems=newList<MenuItem>();

_menuItemsAdd(_menuItem);

}

publicIterator<MenuItem>createIterator()

{

returnnewPancakeHouseMenuIterator<MenuItem>(_menuItems);

}

}

菜单项具体内容:为了简化代码在这就写了菜单项的名称其它的省略了

publicclassMenuItem

{

//菜单具体内容名称

string_name;

publicMenuItem(stringname)

{

this_name=name;

}

/**////<summary>

///菜单项名称

///</summary>

publicstringname

{

get{returnthis_name;}

set{this_name=value;}

}

}

服务员调用代码有了菜单还得要有服务的服务服务员的责任就是打印出来两家餐厅的所在菜单项供客人点餐

publicclassWaitress

{

PancakeHouseMenu_PancakeHouseMenu;

DinerMenu_DinerMenu;

publicWaitress(PancakeHouseMenupancakeHouseMenuDinerMenudinerMenu)

{

this_PancakeHouseMenu=pancakeHouseMenu;

this_DinerMenu=dinerMenu;

}

/**////<summary>

///返回菜单项的内容

///</summary>

///<paramname=iterator></param>

///<returns></returns>

publicstringprintMenu(Iterator<MenuItem>iterator)

{

stringsContent=;

while(iteratorhasNext())

{

MenuItemmenuItem=(MenuItem)iteratornext();

sContent+=menuItemname+\n;

}

returnsContent;

}

publicstringprintMenu()

{

//对象村餐厅菜单内容

Iterator<MenuItem>dinerMenuIterator=_DinerMenucreateIterator();

//对象村煎饼店餐厅菜单内容

Iterator<MenuItem>pancakeHouseMenuIterator=_PancakeHouseMenucreateIterator();

strings=;

s+=对象村餐厅菜单内容:+printMenu(dinerMenuIterator)+\n;

s+=对象村煎饼店餐厅菜单内容:+printMenu(pancakeHouseMenuIterator);

returns;

}

}

client调用简单的打印出了两家餐厅的所有菜单项的名称

PancakeHouseMenupancakeHouseMenu=newPancakeHouseMenu();

DinerMenudinerMenu=newDinerMenu();

Waitresswaitress=newWaitress(pancakeHouseMenudinerMenu);

strings=waitressprintMenu();

thisLabelText=s;

总结迭代器模式针对多种聚合对象操作的实现特别有帮助可以将多种不同的聚合对象统一起来

上一篇:一维数组、多维数组、非齐整数组

下一篇:对IOC和DI的理解