您的位置:首页 > 其它

设计模式(十一):迭代器模式

2013-05-12 00:24 330 查看
定义:迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。

即不论对象内部的元素是以数组存放还是容器类型存放,都可以对外表现为迭代器形式。

#include <iostream>
#include <string>
#include <assert.h>

using namespace std;

class MenuItem
{
public:
MenuItem(){}
MenuItem( string &name, string& des, bool ck, float pric );
~MenuItem(){}

string& getItem()
{
return itemName;
}

string& getDes()
{
return description;
}

bool getCanCook()
{
return canCook;
}

float getPrice()
{
return price;
}

private:
string itemName;
string description;
bool canCook;
float price;
};

MenuItem::MenuItem( string &name, string& des, bool ck, float pric )
{
itemName = name;
description = des;
canCook = ck;
price = pric;
}

class Iterator_MenuItem
{
public:
Iterator_MenuItem(){}
~Iterator_MenuItem(){}

virtual bool hasNext() = 0;
virtual MenuItem* next() = 0;

/* data */
};

#define MAX_ITEM 20

class PancakeHouseMenu : public Iterator_MenuItem
{
public:
PancakeHouseMenu();
~PancakeHouseMenu(){}

bool hasNext();
MenuItem* next();

private:
void addItem( string &name, string& des, bool ck, float pric );

private:
MenuItem* item[MAX_ITEM];
int count;
int iter;
};

PancakeHouseMenu::PancakeHouseMenu()
{
count = 0;
iter = 0;

addItem( ( string )"K&B's Breakfast.", ( string )"Panckes with scrambled eggs.", true, 2.99f );
addItem( ( string )"Regular Pancake Breakfast.", ( string )"Panckes made with fresh blueberries.", false, 3.99f );
addItem( ( string )"Waffles.", ( string )"Waffles, with your choice of blueberries or strawberries.", true, 1.99f );
}

void PancakeHouseMenu::addItem( string &name, string& des, bool ck, float pric )
{
MenuItem *pMenuItem = new MenuItem( name, des, ck, pric );
item[count++] = pMenuItem;
}

bool PancakeHouseMenu::hasNext()
{
return iter < count ? true : false;
}

MenuItem* PancakeHouseMenu::next()
{
return item[iter++];
}

void TestIteratorPattern()
{
PancakeHouseMenu pa;

MenuItem* pTemp = NULL;

assert( true == pa.hasNext() );
pTemp = pa.next();
assert( ( string )"K&B's Breakfast." == pTemp->getItem() );
assert( ( string )"Panckes with scrambled eggs." == pTemp->getDes() );
assert( true == pTemp->getCanCook() );
assert( 2.99f == pTemp->getPrice() );

assert( true == pa.hasNext() );
pTemp = pa.next();
assert( ( string )"Regular Pancake Breakfast." == pTemp->getItem() );
assert( ( string )"Panckes made with fresh blueberries." == pTemp->getDes() );
assert( false == pTemp->getCanCook() );
assert( 3.99f == pTemp->getPrice() );

assert( true == pa.hasNext() );
pTemp = pa.next();
assert( ( string )"Waffles." == pTemp->getItem() );
assert( ( string )"Waffles, with your choice of blueberries or strawberries." == pTemp->getDes() );
assert( true == pTemp->getCanCook() );
assert( 1.99f == pTemp->getPrice() );

}

int main()
{
TestIteratorPattern();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: