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

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

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

  

#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;
}
原文地址:https://www.cnblogs.com/bracken/p/3073581.html