当前位置: 首页 > article >正文

设计模式-迭代器模式

定义

迭代器模式是一种行为型设计模式,它提供一种按顺序访问聚合对象中的元素的方法,而又无须暴露聚合对象的内部表示。迭代器模式通过将集合对象的迭代行为抽象到迭代器中,提供一致的接口,使得不同的容器可以提供一致的遍历行为。

在迭代器模式中,主要涉及以下角色:

  • 抽象迭代器(Iterator):负责定义访问和遍历元素的接口。
  • 具体迭代器(ConcreteIterator):提供具体的元素遍历方法。
  • 抽象容器(IAggregate):负责定义提供具体迭代器的接口。
  • 具体容器(ConcreteAggregate):创建具体迭代器。

使用迭代器模式可以方便地遍历容器,同时容器类型的改变对整体的影响较小。此外,迭代器模式还具有较好的封装性,将对象的内部结构和遍历过程都封装在迭代器中。然而,如果只是简单地遍历一个数组或其他简单的数据结构,使用for循环可能更为方便。

实现举例

当然可以!以下是一个使用C++实现的迭代器模式的示例:

#include <iostream>
#include <vector>

// 抽象迭代器
class Iterator {
public:
    virtual bool hasNext() const = 0;
    virtual int next() = 0;
};

// 具体迭代器
class ConcreteIterator : public Iterator {
private:
    int current_;
    const std::vector<int>& data_;
public:
    ConcreteIterator(const std::vector<int>& data) : current_(0), data_(data) {}
    bool hasNext() const override {
        return current_ < data_.size();
    }
    int next() override {
        if (hasNext()) {
            return data_[current_++];
        } else {
            throw std::out_of_range("No more elements");
        }
    }
};

// 抽象容器
class Aggregate {
public:
    virtual Iterator* createIterator() const = 0;
};

// 具体容器
class ConcreteAggregate : public Aggregate {
private:
    std::vector<int> data_;
public:
    ConcreteAggregate(const std::vector<int>& data) : data_(data) {}
    Iterator* createIterator() const override {
        return new ConcreteIterator(data_);
    }
};

int main() {
    std::vector<int> data = {1, 2, 3, 4, 5};
    ConcreteAggregate aggregate(data);
    Iterator* iterator = aggregate.createIterator();
    while (iterator->hasNext()) {
        std::cout << iterator->next() << " ";
    }
    std::cout << std::endl;
    delete iterator; // 释放迭代器对象内存
    return 0;
}

总结

迭代器模式的主要特性包括:

  1. 访问聚合对象的内容而无需暴露其内部表示。
  2. 为遍历不同的集合结构提供一个统一的接口,从而支持同样的算法在不同的集合结构上进行操作。
  3. 遍历任务交由迭代器完成,这简化了聚合类。
  4. 支持以不同方式遍历一个聚合,甚至可以自定义迭代器的子类以支持新的遍历。
  5. 增加新的聚合类和迭代器类都很方便,无须修改原有代码。
  6. 封装性良好,为遍历不同的聚合结构提供一个统一的接口。

http://www.kler.cn/a/145993.html

相关文章:

  • EasyControl:首个登陆AWS Marketplace的中国MDM先锋
  • AIGC视频生成明星——Emu Video模型
  • 一些面试常见问题及其回答参考
  • 为AI聊天工具添加一个知识系统 之54 为事务处理 设计 基于DDD的一个 AI操作系统 来处理维度
  • 【算法】算法基础课模板大全——第一篇
  • AudioGPT全新的 音频内容理解与生成系统
  • Python数据结构
  • NX二次开发UF_CURVE_ask_offset_parms 函数介绍
  • 线性代数的艺术
  • 设计模式精讲:掌握单例模式的实现与优化
  • 上海亚商投顾:北证50指数大涨 逾百只北交所个股涨超10%
  • 交换技术-电路交换-报文交换-分组交换
  • 深入理解强化学习——马尔可夫决策过程:贝尔曼期望方程-[基础知识]
  • 初识数据结构
  • Java之API(上):Boolean
  • pygame加载图像,并让小球做平抛运动
  • 第十七周周报-王雲慧
  • MongoDB使用$literal获取表达式字面值
  • 案例030:基于微信小程序的英语学习交流平台
  • Spring Cache框架,实现了基于注解的缓存功能。
  • 【洛谷算法题】P5715-三位数排序【入门2分支结构】
  • Zynq-7000系列FPGA使用 Video Processing Subsystem 实现图像缩放,提供工程源码和技术支持
  • Nginx 学习笔记
  • 27. Spring源码篇之SpEL表达式之自定义解析模版
  • leetcode 最大整除子集
  • 【网络奇幻之旅】那年我与大数据的邂逅