蜗牛的家
男儿当自强
posts - 48,  comments - 21,  trackbacks - 0
意图:
提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示
UML图:

适用:
访问一个聚合对象的内容而无需暴露它的内部表示
支持对聚合对象的多种遍历
为遍历不同的聚合结构提供一个统一的接口
//test.h
typedef int DATA;
//////////////////////////////////////////////////////////////////////////
class Iterater;

class Aggregate
{
public:
    
virtual ~Aggregate(){}
    
    
virtual int GetSize() = 0;
    
virtual DATA GetItem(int nIndex) = 0;
}
;

class Iterater
{
public:
    
virtual ~Iterater(){}
    
    
virtual void First() = 0;
    
virtual void Next() = 0;
    
virtual bool IsDone() = 0;
    
virtual DATA CurrentIter() = 0;

protected:
    Aggregate 
*m_pConCreateAggregate;
    
int m_nIndex;
}
;

class ConCreateAggregate : public Aggregate
{
public:
    ConCreateAggregate(
int nSize);
    
virtual ~ConCreateAggregate();

    
virtual int GetSize();
    
virtual DATA GetItem(int nIndex);
private:
    
int m_nSize;
    DATA 
*m_pData;
}
;

class ConCreateIterater : public Iterater
{
public:
    ConCreateIterater(Aggregate
* pAggregate);
    
virtual ~ConCreateIterater(){}
    
    
virtual void First();
    
virtual void Next();
    
virtual bool IsDone();
    
virtual DATA CurrentIter();
}
;

// test.cpp : Defines the entry point for the console application.
//

#include 
"stdafx.h"
#include 
<iostream>
#include 
"test.h"


//////////////////////////////////////////////////////////////////////////
ConCreateAggregate::ConCreateAggregate(int nSize) : m_nSize(nSize),m_pData(NULL)
{
    m_pData 
= new DATA[m_nSize];
    
for (int i=0; i<nSize; ++i)
    
{
        m_pData[i] 
= i;
    }

}


ConCreateAggregate::
~ConCreateAggregate()
{
    delete []m_pData;
    m_pData 
= NULL;
}


int ConCreateAggregate::GetSize()
{
    
return m_nSize;
}


DATA ConCreateAggregate::GetItem(
int nIndex)
{
    
//对外提供相同的接口,得到特定次序的值
    if (nIndex < m_nSize)
    
{
        
return m_pData[nIndex];
    }

    
else
    
{
        
return -1;
    }

}


ConCreateIterater::ConCreateIterater(Aggregate
* pAggregate)
{
    m_pConCreateAggregate 
= pAggregate;
    m_nIndex 
= 0;
}


void ConCreateIterater::First()
{
    m_nIndex 
= 0;
}


void ConCreateIterater::Next()
{
    
if (m_nIndex < m_pConCreateAggregate->GetSize())
    
{
        
++m_nIndex;
    }

}


bool ConCreateIterater::IsDone()
{
    
return m_nIndex == m_pConCreateAggregate->GetSize();
}


DATA ConCreateIterater::CurrentIter()
{
    
//间接引用此函数得到值
    return m_pConCreateAggregate->GetItem(m_nIndex);
}

//////////////////////////////////////////////////////////////////////////
int main(int argc, char* argv[])
{
    Aggregate
* pAggregate = new ConCreateAggregate(4);
    Iterater
* pIterater = new ConCreateIterater(pAggregate);
    
    
for (;false == pIterater->IsDone(); pIterater->Next())
    
{
        std::cout 
<< pIterater->CurrentIter()<<"\n";
    }


    system(
"pause");
    
return 0;
}


posted on 2008-08-23 01:18 黑色天使 阅读(552) 评论(0)  编辑 收藏 引用 所属分类: 设计模式

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理



<2008年8月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
31123456

常用链接

留言簿(2)

随笔分类

随笔档案

文章档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜