设计模式十七:iterator(迭代器)——对象行为型模式

iterator(迭代器)——对象行为型模式

1.意图

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

2.别名

游标(cursor)

3.动机

一个聚合对象,应该提供一种方法来让别人可以访问它的列表,而又不暴露它的内部结构。此外,针对不同需要,可能要以不同的方式遍历这个列表。但是即使可以预见到所需的那些遍历操作,你可能也不希望列表的接口中充斥着各种不同遍历的操作。有时还可能需要在同一列表上同时进行各个遍历。

迭代器模式都可以解决这些问题。这一模式的关键思想是将对列表的访问和访问从列表对象中分离出来并且放入一个迭代器对象中。迭代器类定义了一个访问该列表元素的接口。迭代器对象负责跟踪当前的元素。

4.适用性

1)访问一个聚合对象的内容而无需暴露他的内部表示。

2)支持对聚合对象的多种遍历

3)为遍历不同的聚合结构提供一个统一的接口

5.结构

设计模式十七:iterator(迭代器)——对象行为型模式

参考:http://www.cnblogs.com/aspnet2008/archive/2008/05/11/1192418.html

6.参与者

iterator迭代器

迭代器定义访问和遍历元素的接口

concreteIterator具体迭代器

具体迭代器实现迭代器接口

对该聚合遍历时跟踪当前位置

Aggregate聚合

聚合定义创建相应迭代器对象的接口

concreteAggregate具体聚合

具体聚合实现创建相应迭代器的接口,该操作返回concreteIterator的一个适当实例

7.协作

concreteIterator跟踪聚合中的当前对象,并且能够计算出待遍历的后继对象。

8.效果

1)支持以不同方式遍历一个聚合

2)迭代器简化了聚合的接口

3)在同一个聚合上可以有多个遍历

9.实现

1)谁该控制迭代

当有客户来控制迭代时,称为外部迭代器。客户需要主动推进迭代器遍历的步伐,显式的请求下一个元素。

当由迭代器控制迭代时,称为内部迭代器。客户只需要向迭代器递交一个需要进行的操作,迭代器自动对聚合中的每一个元素实施该操作。

2)谁定义遍历算法

迭代器和聚合都可以定义。

如果在迭代器上定义,那么将易于在相同的聚合上定义不同的迭代算法。同时也易于在不同的聚合上定义相同的算法。

3)迭代器的健壮度如何

4)附加迭代器的操作

5)在c++中使用多态的迭代器

6)迭代器可有访问特权

迭代器可以看成是聚合的扩展。迭代器和聚合紧密耦合。为了扩展,迭代器可能包含一些protect操作来访问聚合类的重要的非公共可见的成员。迭代器子类可以使用这些操作来得到该聚合的特权访问

7)用于复合对象的迭代器

8)空迭代器

一个空迭代器是一个退化的迭代器,有助于处理边界条件。一个空迭代器总是已经完成了遍历。

10.代码示例

#include<iostream>
#include<string>
using namespace std;

class dish
{
public:
    dish(string str)
    {
        name = str;
    }
    string getName()
    {
        return name;
    }
    void setName(string n)
    {
        name = n;
    }
private:
    string name;
};

class menu
{
private:
    dish *list[10];
    int maxlen;
public:
    menu()
    {
        for(int i=0;i<10;i++)
        {
            list[i]=0;
        }
        maxlen=0;
    }
    void append(dish *d)
    {
        list[maxlen]=d;
        maxlen++;
    }
    int getMaxlen()
    {
        return maxlen;
    }
    string getItem(int n)
    {
        return list[n]->getName();
    }
};

class Iterator
{
public:
    virtual bool hasNext(){return 0;};
    virtual bool next(){return 0;};
    virtual bool last(){return 0;};
    virtual int currentPos(){return 0;};
protected:
    int pos;
};

class concreteIterator:public Iterator
{
public:
    concreteIterator(menu *_m)
    {
        m = _m;
        pos=0;
    }
    bool hasNext()
    {
        if(pos<m->getMaxlen())
            return 1;
        return 0;
    }
    bool next()
    {
        if(pos+1<=m->getMaxlen())
        {
            pos++;
            return 1;
        }
        return 0;
    }
    bool last()
    {
        if(pos>0)
        {
            pos--;
            return 1;
        }
        return 0;
    }
    int currentPos()
    {
        return pos;
    }
private:
    menu *m;
};


int main()
{
    menu *mm = new menu();
    mm->append(new dish("meat"));
    mm->append(new dish("vegetable"));
    mm->append(new dish("fish"));
    Iterator *iter = new concreteIterator(mm);
    while(iter->hasNext())
    {
        string name = mm->getItem(iter->currentPos());
        cout<<name<<endl;
        iter->next();
    }
    system("pause");
    return 0;
}

写的好烂的代码。。凑合意思一下吧。。。

11.相关模式

composite

迭代器常被应用到像复合这样的递归结构上

factory method

多态迭代器靠工厂方法来实例化适当的迭代器子类

memento

常与迭代器模式一起使用。迭代器可使用一个memento来捕获一个迭代的状态。迭代器在其内部存储memento。



原文链接: https://www.cnblogs.com/w0w0/archive/2012/05/21/2511659.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/50722

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 上午2:21
下一篇 2023年2月9日 上午2:22

相关推荐