设计模式 迭代器模式
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 start ========
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
=== jhluroom finish _^_ ===
#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 _^_ ===
相关文章推荐
- 设计模式--迭代器模式(C++实现)
- Groovy 设计模式 -- 迭代器模式
- 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern)
- 23种设计模式(13):迭代器模式
- 设计模式之实现迭代器模式
- 设计模式之迭代器模式
- 设计模式-迭代器模式
- Java设计模式-----Iterator迭代器模式
- 【学习笔记javascript设计模式与开发实践(迭代器模式)----7】
- HeadFirst 设计模式学习笔记9--迭代器模式
- 架构设计九之策略模式、迭代器模式
- 【设计模式 - 16】之迭代器模式(Iterator)
- 设计模式——迭代器模式
- 设计模式之迭代器模式 Iterator
- 设计模式-迭代器模式
- 设计模式-迭代器模式-iterator-python
- 设计模式笔记(八)--迭代器模式、组合模式
- 设计模式之迭代器模式
- 设计模式-迭代器模式(9)
- 设计模式之迭代器模式