行为型模型 迭代器模式

行为型模型 迭代器模式

 

 GOOD:提供一种方法顺序访问一个聚敛对象的各个元素,而又不暴露该对象的内部表示。 

为遍历不同的聚集结构提供如开始,下一个,是否结束,当前一项等统一接口。

 

 

 

Iterator(迭代器接口):
        该接口必须定义实现迭代功能的最小定义方法集
        比如提供hasNext()和next()方法。
ConcreteIterator(迭代器实现类):
        迭代器接口Iterator的实现类。可以根据具体情况加以实现。
Aggregate(容器接口):
        定义基本功能以及提供类似Iterator iterator()的方法。
concreteAggregate(容器实现类):
        容器接口的实现类。必须实现Iterator iterator()方法。

 

/**
 * 行为型模型 迭代器模式
 * Iterator模式也叫迭代模式,是行为模式之一,它把对容器中包含的内部对象的访问委让给外部类,使用Iterator(遍历)按顺序进行遍历访问的设计模式。
 *
 */

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <string>

typedef int Object;
#define SIZE 5

class MyIterator
{
public:
    virtual void First() = 0;
    virtual void Next() = 0;
    virtual bool IsDone() = 0;
    virtual Object Currentitem() = 0;
    virtual ~MyIterator() {}
};

class Aggregate
{
public:
    virtual Object getItem(int index) = 0;
    virtual MyIterator *CreateIterator() = 0;
    virtual int getSize() = 0;
    virtual ~Aggregate() {}
};

class ContreteIierator: public MyIterator
{
public:
    ContreteIierator(Aggregate *ag)
    {
        _ag = ag;
        _idx = 0;
    }
    ~ContreteIierator()
    {
        _ag = nullptr;
        _idx = 0;
    }
    virtual void First() override
    {
        _idx = 0;
    }
    virtual void Next() override
    {
        if (_idx < _ag->getSize())
        {
            _idx++;
        }
    }
    virtual bool IsDone() override
    {
        return (_idx == _ag->getSize());
    }
    virtual Object Currentitem() override
    {
        return _ag->getItem(_idx);
    }
private:
    int _idx;
    Aggregate * _ag;
};

class ConcreateAggregate: public Aggregate
{
public:
    ConcreateAggregate()
    {
        for (int i = 0; i < SIZE; i++)
        {
            object[i] = i+1;
        }
    }
    ~ConcreateAggregate()
    {
        for (int i = 0; i < SIZE; i++)
        {
            object[i] = 0;
        }
    }
    virtual Object getItem(int index) override
    {
        return object[index];
    }
    virtual MyIterator *CreateIterator() override
    {
        return new ContreteIierator(this);
    }
    virtual int getSize() override
    {
        return SIZE;
    }

private:
    Object object[SIZE];
};


void mytest()
{
    // 创建一个集合
    Aggregate *ag = new ConcreateAggregate();
    // 创建一个遍历这个集合的迭代器
    MyIterator *it = ag->CreateIterator();

    // 通过迭代器遍历集合
    for (; !(it->IsDone()); it->Next())
    {
        std::cout << it->Currentitem() << " ";
    }
    std::cout << std::endl;

    // 清理相关资源
    delete it;
    delete ag;

    return;
}

int main()
{
    mytest();

    system("pause");
    return 0;
}

 

posted @ 2017-11-04 17:07  lsgxeva  阅读(342)  评论(0编辑  收藏  举报