您的位置:首页 > 编程语言 > Qt开发

设计模式 迭代器模式

2011-09-12 10:50 260 查看
1、iterator.h

#ifndef ITERATOR_H
#define ITERATOR_H

#include <iostream>
using namespace std;

class IntStack //Container,聚合类,就是访问这个类中的数据
{
public:
IntStack();
virtual ~IntStack();
void Push(int);
int Pop();
friend class IntStackIterator;//声明友元类
private:
enum { SIZE = 100 };
int mStack[SIZE];
int mTop;
};

class Iterator //Iterator,基类
{
public:
Iterator();
virtual ~Iterator();
virtual void SetBegin() = 0;
virtual void SetEnd() = 0;
virtual int First() = 0;
virtual int End() = 0;
virtual void Next() = 0;
virtual int CurrentItem() =0;
virtual bool IsDone() = 0;
};

class IntStackIterator : public Iterator //Concrete-Iterator,具体类
{
public:
IntStackIterator(IntStack*);
~IntStackIterator();
void SetBegin();
void SetEnd();
int First();
int End();
void Next();
int CurrentItem();
bool IsDone();
private:
IntStack* mIntStack;
int current;
};
#endif // ITERATOR_H
2、iterator.cpp

#include "iterator.h"

IntStack::IntStack()
{
mTop = 0;
}

IntStack::~IntStack(){}

void IntStack::Push(int nData)
{
if(mTop < SIZE)
{
mStack[mTop++] = nData;
}
else
{
cout << "the stack is full" << endl;
}
}

int IntStack::Pop()
{
if(mTop > 0)
{
return mStack[--mTop];
}
return 0;
}

Iterator::Iterator(){}

Iterator::~Iterator(){}

IntStackIterator::IntStackIterator(IntStack* pStack)
{
mIntStack = pStack;
current = 0;
}

IntStackIterator::~IntStackIterator()
{
if(mIntStack != NULL)
{
delete mIntStack;
mIntStack = NULL;
}
}

void IntStackIterator::SetBegin()
{
current =0;
}

void IntStackIterator::SetEnd()
{
if(mIntStack->mTop>0)
{
current = mIntStack->mTop-1;
}
else
{
current = 0;
}
}

int IntStackIterator::First()
{
if(mIntStack->mTop>0)
{
return mIntStack->mStack[0];
}
else
{
return -1;
}
}

int IntStackIterator::End()
{
if(mIntStack->mTop>0)
{
return mIntStack->mStack[mIntStack->mTop-1];
}
else
{
return -1;
}
}

void IntStackIterator::Next()
{
if((mIntStack->mTop>1)&&(current<(mIntStack->mTop-1)))
{
current++;
}
else
{
return;
}
}

int IntStackIterator::CurrentItem()
{
if((current>=0)&&(current<=(mIntStack->mTop-1)))
{
return mIntStack->mStack[current];
}
else
{
return -1;
}
}

bool IntStackIterator::IsDone()
{
return current == mIntStack->mTop-1;
}

3、main.cpp
/*
作者:jhluroom弹   QQ:454676244  MSN:jhlu0815@hotmail.com
开发IDE:qt creater
开发环境:QT C++
参考网站:神秘果:http://www.shenmiguo.com/

定义:
迭代器模式(Iterator):提供一种方法,顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示.
Client通过Concrete-Iterator访问Container中的数据对象,但用户并不知道Container的存储结构。

理解:
迭代器模式由以下角色组成:
1) 迭代器角色(Iterator):迭代器角色负责定义访问和遍历元素的接口。
2) 具体迭代器角色(Concrete Iterator):具体迭代器角色要实现迭代器接口,并要记录遍历中的当前位置。
3) 容器角色(Container):容器角色负责提供创建具体迭代器角色的接口。
4) 具体容器角色(Concrete Container):具体容器角色实现创建具体迭代器角色的接口——这个具体迭代器角色于该容器的结构相关。

要点:

应用:
用迭代器,来模拟访问栈的过程。

以上文字说明,从网上整理而来,有可能部分与其他同仁相同,请谅解,希望我们能够共同交流,谢谢!
*/

#include <QtCore/QCoreApplication>

#include "iterator.h"

int main(int argc, char *argv[])
{
cout << "=== jhluroom start ========" << endl;

//Client,
IntStack* pStack = new IntStack();
for(int i = 1; i < 20; ++i)
{
pStack->Push(i);
}

Iterator* iter = new IntStackIterator(pStack);
iter->SetBegin();
while (!(iter->IsDone()))
{
cout << iter->CurrentItem()<<" ";
iter->Next();
}
cout << endl;

cout << "=== jhluroom finish _^_ ===" << endl;
return 0;
}


运行结果:

=== jhluroom start ========

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 
=== jhluroom finish _^_ ===
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息