`
runfeel
  • 浏览: 935538 次
文章分类
社区版块
存档分类
最新评论

我所理解的设计模式(C++实现)——迭代器模式(Iterator Pattern)

 
阅读更多

概述:

在现在的电视机中,我们使用[后一个][前一个]按钮可以很方便的换台,当按下[后一个]按钮时,将切换到下一个预置的频道。想象一下在陌生的城市中的旅店中看电视。当改变频道时,重要的不是几频道,而是节目内容。如果对一个频道的节目不感兴趣,那么可以换下一个频道,而不需要知道它是几频道。

这个其实就是我们迭代器模式的精髓:提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。

类图和实例:


迭代器模式由以下角色组成:

1迭代器角色Iterator):迭代器角色负责定义访问和遍历元素的接口。
2.具体迭代器角色ConcreteIterator):具体迭代器角色要实现迭代器接口,并要记录遍历中的当前位置。
3.集合角色Aggregate):集合角色负责提供创建具体迭代器角色的接口。
4.具体集合角色ConcreteAggregate):具体集合角色实现创建具体迭代器角色的接口——这个具体迭代器角色于该集合的结构相关。

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

template<class Item>
class Iterator
{
public:
    virtual void first()=0;
    virtual void next()=0;
    virtual Item* currentItem()=0;
    virtual bool isDone()=0;
    virtual ~Iterator(){}
};

template<class Item>
class ConcreteAggregate;

template<class Item>
class ConcreteIterator : public Iterator <Item>
{
    ConcreteAggregate<Item> * aggr;
    int cur;
public:
    ConcreteIterator(ConcreteAggregate<Item>*a):aggr(a),cur(0){}
    virtual void first()
    {
        cur=0;
    }
    virtual void next()
    {
        if(cur<aggr->getLen())
            cur++;
    }
    virtual Item* currentItem()
    {
        if(cur<aggr->getLen())
            return &(*aggr)[cur];
        else
            return NULL;
    }
    virtual bool isDone()
    {
        return (cur>=aggr->getLen());
    }
};

template<class Item>
class Aggregate
{
public:
    virtual Iterator<Item>* createIterator()=0;
    virtual ~Aggregate(){}
};

template<class Item>
class ConcreteAggregate:public Aggregate<Item>
{
    vector<Item >data;
public:
    ConcreteAggregate()
    {
        data.push_back(1);
        data.push_back(2);
        data.push_back(3);
    }
    virtual Iterator<Item>* createIterator()
    {
        return new ConcreteIterator<Item>(this);
    }
    Item& operator[](int index)
    {
        return data[index];
    }
    int getLen()
    {
        return data.size();
    }
};

int main()
{
    Aggregate<int> * aggr =new ConcreteAggregate<int>();
    Iterator<int> *it=aggr->createIterator();

    for(it->first();!it->isDone();it->next())
    {
        cout<<*(it->currentItem())<<endl;
    }
    delete it;
    delete aggr;
    return 0;
}

实现要点:

1.迭代抽象:访问一个聚合对象的内容而无需暴露它的内部表示。

2.迭代多态:为遍历不同的集合结构提供一个统一的接口,从而支持同样的算法在不同的集合结构上进行操作。

3.迭代器的健壮性考虑:遍历的同时更改迭代器所在的集合结构,会导致问题。

适用性:

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

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

3.为遍历不同的聚合结构提供一个统一的接口(,支持多态迭代)

其他:

1.在C++下可以参看STLiterators的实现。

2.在.NET下实现Iterator模式,对于聚集接口和迭代器接口已经存在了,其中IEnumerator扮演的就是迭代器的角色,而IEnumerable则扮演的就是抽象聚集的角色,她只有一个GetEnumerator()方法,如果集合对象需要具备跌代遍历的功能,就必须实现该接口。

3在Java下可以参看集合类型迭代器(java.util.Iterator,java.util.Enumeration)。


LCL_data原创于CSDN.NET【http://blog.csdn.net/lcl_data/article/details/9310313

其他设计模式请参看:我所理解的设计模式

分享到:
评论

相关推荐

    Head First 设计模式 (九) 迭代器与组合模式(Iterator & Composite pattern) C++实现

    迭代器模式(Iterator Pattern)和组合模式(Composite Pattern)是设计模式中的两种重要结构型模式,它们在软件设计中有着广泛的应用。这两种模式都属于GoF(Gang of Four)设计模式,旨在解决特定的问题,提升代码...

    C++设计模式课件21_Iterator_迭代器.pdf

    本文将基于“C++设计模式课件21_Iterator_迭代器.pdf”的内容,详细介绍迭代器模式的基本概念、实现方式以及应用场景,并结合C++语言特性进行深入探讨。 #### 二、迭代器模式定义 迭代器模式(Iterator Pattern)...

    C++设计模式(Design Pattern)范例源代码

    23种设计模式(Design Pattern)的C++实现范例,包括下面列出的各种模式,代码包含较详细注释。另外附上“设计模式迷你手册.chm” 供参考。 注:项目在 VS2008 下使用。 创建型: 抽象工厂模式(Abstract Factory) ...

    [行为型模式]迭代器模式的理解

    迭代器模式是一种行为设计模式,它提供了一种方法来顺序访问聚合对象的元素,而又不暴露其底层表示。这种模式允许我们遍历集合中的每个元素,而无需暴露集合的内部结构。在C++中,我们可以使用迭代器模式来实现类似...

    C++面向对象23种设计模式实现源码DesignPattern.zip

    本资源“DesignPattern.zip”包含了23种经典的面向对象设计模式的C++实现源码,这对于学习和理解这些模式的原理及应用具有极大的帮助。 1. **解释器模式(Interpreter Pattern)**:解释器模式主要用于创建一个解析...

    23种设计模式的C++实现DesignPattern-master.zip

    本资源"23种设计模式的C++实现DesignPattern-master.zip"包含了以下设计模式的C++实现: 1. **创建型模式**: - **单例模式(Singleton)**:保证一个类只有一个实例,并提供全局访问点。 - **工厂方法模式...

    23种设计模式-C++实现.zip

    设计模式是软件工程中经过长期实践验证的有效解决方案模板,它们为常见的编程问题提供了...在压缩包中的"DesignPattern-master"文件夹中,你将找到每个设计模式的详细实现示例,这将是你学习和理解设计模式的宝贵资源。

    设计模式实现(Java、C++、Golang)-DesignPattern.zip

    本资料包“DesignPattern.zip”包含了Java、C++和Golang三种编程语言的设计模式实现,这对于想要深入理解这些语言的开发者来说是非常宝贵的资源。 1. **设计模式分类**: 设计模式通常分为三类:创建型、结构型和...

    23种设计模式的C++实现.zip

    这个“DesignPattern-master”压缩包提供的C++实现,涵盖了以上所有设计模式,对于学习和理解设计模式及其在C++中的应用非常有帮助。通过深入研究这些示例代码,开发者可以提升自己的编程技巧,优化软件设计,提高...

    C++设计模式课件26_设计模式总结.pdf

    - **迭代器模式**(Iterator Pattern):提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。 - **观察者模式**(Observer Pattern):定义对象间的一种一对多的依赖关系,当一个对象的状态...

    c++设计模式 设计模式精解-GoF 23种设计模式解析附C++实现源码

    ### C++设计模式精解——GoF 23种设计模式解析及C++实现源码 #### 引言 设计模式作为面向对象编程的核心组成部分,是软件开发者在长期实践中总结出来的最佳实践。本文旨在深入剖析GoF(Gang of Four)提出的23种...

    java设计模式---诙谐易懂版

    代理模式(Proxy Pattern)、单例模式(Singleton Pattern)、工厂方法...迭代器模式(Iterator Pattern)、组合模式(Composite Pattern)、观察者模式(Observer Pattern)、责任链模式(Chain of Responsibility ...

    GOF23种设计模式 C++源代码实例解析

    15. **迭代器模式** (Iterator Pattern):提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其底层表示。 16. **访问者模式** (Visitor Pattern):表示一个作用于某对象结构中的各元素的操作。它使你可以...

    iterator_facade.pdf

    `iterator_facade`是Boost库提供的一种设计模式,它是一个基类模板,用于简化自定义迭代器的实现。这个模板将标准迭代器接口的实现抽象为几个核心函数和相关类型,由派生的迭代器类提供。 **iterator_facade的要求...

    设计模式之C++版.doc

    迭代器模式(Iterator)提供一种方法顺序访问聚合对象的元素,而又不暴露其底层表示。策略模式(Strategy)定义了一系列算法,并将每一个算法封装起来,使它们可以互相替换,策略对象可以独立变化。 6. **类与类的...

    设计模式精解-GoF 23种设计模式解析附C++实现源码

    ### 设计模式精解——GoF 23种设计模式解析及C++实现源码 #### 0. 引言 设计模式是软件工程领域的一个重要概念,它为解决特定问题提供了一套标准的解决方案。根据GoF(四人组)的经典著作《设计模式:可复用面向对象...

    C++11全套设计模式-23种指针的用法(a full DesignPattern -DesignPattern.zip

    本资料包“DesignPattern - DesignPattern.zip”提供了对C++11中23种设计模式的全面讲解,特别是结合指针使用的部分,以下是对这些知识点的详细阐述: 1. **单例模式(Singleton)**:确保一个类只有一个实例,并...

    Design Pattern(设计模式)讲义

    - **迭代器模式(Iterator)**:提供一种方法顺序访问一个聚合对象中各个元素而又不暴露该对象的内部表示。 - **中介者模式(Mediator)**:用一个中介对象来封装一系列的对象交互。 - **备忘录模式(Memento)**:...

    java设计模式;java语言描述;经典的设计模式

    3. 行为型模式(Behavioral Patterns):这类模式主要处理对象之间的责任分配,包括责任链模式(Chain of Responsibility)、命令模式(Command)、解释器模式(Interpreter)、迭代器模式(Iterator)、中介者模式...

Global site tag (gtag.js) - Google Analytics