迭代器模式

  • 一、概述
    • 二、结构
      • 三、适用场景
      • 四、实例
      • 五、优缺点

一、概述

迭代器是一种行为设计模式,让你能在不暴露集合底层表现形式(列表、栈和树等)的情况下遍历集合中所有的元素。

二、结构

  1. 迭代器(Iterator):接口类,声明了遍历集合所需的操作(获取下一个元素、获取当前位置和重新开始迭代等)。
  2. 具体迭代器(Concrete Iterators) :实现遍历集合的一种特定算法。迭代器对象必须跟踪自身遍历的进度,这使得多个迭代器可以相互独立地遍历同一集合。
  3. 集合(Collection):接口类,声明一个或多个方法来获取与集合兼容的迭代器。请注意,返回方法的类型必须被声明为迭代器接口,因此具体集合可以返回各种不同种类的迭代器。
  4. 具体集合(Concrete Collections) :会在客户端请求迭代器时返回一个特定的具体迭代器类实体。
  5. 客户端(Client):通过集合和迭代器的接口与两者进行交互。这样一来客户端无需与具体类进行耦合,允许同一客户端代码使用各种不同的集合和迭代器。客户端通常不会自行创建迭代器,而是会从集合中获取。但在特定情况下,客户端可以直接创建一个迭代器(例如当客户端需要自定义特殊迭代器时)。

三、适用场景

  1. 集合复杂的数据结构,希望对客户端隐藏其复杂性时(出于使用便利性或安全性的考虑),可以使用迭代器模式。
  2. 代码能够遍历不同的甚至是无法预知的数据结构,可以使用迭代器模式。

四、实例

#include<iostream>
#include<string>
#include<vector>
using namespace std;// 抽象迭代器,接口
class TVIterator {public:virtual void setChannel(int i) = 0;virtual void next() = 0;virtual void previous() = 0;virtual bool isLast() = 0;virtual string currentChannel() = 0;virtual bool isFirst() = 0;
};//具体实现方法迭代器
class SkyworthIterator :public TVIterator {private:vector<string>& tvs_;int current_index_ = 0;
public:explicit SkyworthIterator(vector<string>& tvs) :tvs_(tvs) {}void next() override {if (current_index_ < tvs_.size()){current_index_++;}}void previous()override {if (current_index_ > 0) {current_index_--;}}void setChannel(int i)override {current_index_ = i;}string currentChannel()override {return tvs_[current_index_];}bool isLast()override {return current_index_ == tvs_.size();}bool isFirst()override {return current_index_ == 0;}};//抽象集合
class Television {public:virtual shared_ptr<TVIterator>createIterator() = 0;
};class SkyworthTelevision : public Television {private:vector<string>tvs_;
public:shared_ptr<TVIterator> createIterator() {return make_shared<SkyworthIterator>(tvs_);}void addItem(string item) {tvs_.push_back(item);}
};int main()
{SkyworthTelevision stv;stv.addItem("CCTV-1");stv.addItem("CCTV-2");stv.addItem("CCTV-3");stv.addItem("CCTV-4");stv.addItem("CCTV-5");auto iter = stv.createIterator();while (!iter->isLast()){cout << iter->currentChannel() << endl;iter->next();}return 0;
}

五、优缺点

优点:

  1. 单一职责原则。通过将体积庞大的遍历算法代码抽取为独立的类,你可对客户端代码和集合进行整理。
  2. 开闭原则。你可实现新型的集合和迭代器并将其传递给现有代码,无需修改现有代码。
  3. 可以并行遍历同一集合,因为每个迭代器对象都包含其自身的遍历状态。
  4. 可以暂停遍历并在需要时继续。

缺点:

  1. 对于某些特殊集合,使用迭代器可能比直接遍历的效率低。
  2. 程序只与简单的集合进行交互,应用该模式可能会矫枉过正。

Iteratot(迭代器模式) 行为型相关推荐

  1. 18.迭代器模式(行为型)

    迭代器模式(行为型) 原书链接java设计模式(刘伟) 一.相关概念 在软件开发中,我们经常需要使用聚合对象来存储一系列数据.聚合对象拥有两个职责:一是存储数据:二是遍历数据.从依赖性来看,前者是聚合 ...

  2. 设计模式(十五):Iterator迭代器模式 -- 行为型模式

    1.概述 类中的面向对象编程封装应用逻辑.类,就是实例化的对象,每个单独的对象都有一个特定的身份和状态.单独的对象是一种组织代码的有用方法,但通常你会处理一组对象或者集合. 集合不一定是均一的.图形用 ...

  3. .NET设计模式(18):迭代器模式(Iterator Pattern)(转)

    概述 在面向对象的软件设计中,我们经常会遇到一类集合对象,这类集合对象的内部结构可能有着各种各样的实现,但是归结起来,无非有两点是需要我们去关心的:一是集合内部的数据存储结构,二是遍历集合内部的数据. ...

  4. Java设计模式之行为型:迭代器模式

    一.什么是迭代器模式: 实际开发中,我们针对不同的需求,可能需要以不同的方式来遍历整个整合对象,但我们不希望在集合容器的抽象接口层中充斥着各种不同的遍历操作,这时候我们就需要一种能完成下面功能的迭代器 ...

  5. C#设计模式之十五迭代器模式(Iterator Pattern)【行为型】

    一.引言 今天我们开始讲"行为型"设计模式的第三个模式,该模式是[迭代器模式],英文名称是:Iterator Pattern.还是老套路,先从名字上来看看."迭代器模式& ...

  6. 设计模式 ( 十四 ) 迭代器模式Iterator(对象行为型)

    设计模式 ( 十四 ) 迭代器模式Iterator(对象行为型) 1.概述 类中的面向对象编程封装应用逻辑.类,就是实例化的对象,每个单独的对象都有一个特定的身份和状态.单独的对象是一种组织代码的有用 ...

  7. 行为型模式:迭代器模式

    LieBrother原文: 行为型模式:迭代器模式 十一大行为型模式之六:迭代器模式. 简介 姓名 :迭代器模式 英文名 :Iterator Pattern 价值观 :人生没有回头路 个人介绍 : P ...

  8. 图解Java设计模式学习笔记——行为型模式(模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式)

    一.模板方法模式(模板模式)--钩子方法 1.需求-豆浆制作问题 编写制作豆浆的程序,说明如下: 制作豆浆的流程选材-->添加配料-->浸泡-->放到豆浆机打碎. 通过添加不同的配料 ...

  9. 设计模式的艺术 行为型模式之迭代器模式

    前言 现在的电视机都配置了一个遥控器,用户可以通过遥控器去选择上一个或者下一个台,我们只需要知道如何使用这个遥控器,而无须关注电视是怎么把电视频道放入其中的,在软件实际的开发中,也有这么一种类,它储存 ...

最新文章

  1. 产生随机数的用户图形界面Python GUI
  2. angularjs input标签用一个日期插件后数据不能双向绑定了_微信如何定时发朋友圈?(最方便最好用的办法!)...
  3. JQuery修改background-image背景图片
  4. 使用Zabbix2.2自带的Mysql监控模板监控数据库
  5. 如何应用Java的静态内部类
  6. 0819 - 要想富,追新不守旧
  7. linux ps 程序包,linux ps 详解
  8. matlab色散光纤,基于MATLAB的高速光通信色散补偿技术
  9. TkMybatis的使用
  10. 中国互联网的5大生死逻辑
  11. 3D动画展示--3D图片旋转展示
  12. win2003服务器性能工具,WindowsServer 2003 Service Pack 1 支持工具
  13. 学会“狼”的思维(二)
  14. python负数取模_负数的取模运算
  15. signature=d148aa62ed913fffd968a4a920a9a8a3,a01921.html
  16. 新人如何快速上手项目管理?
  17. 老人与海好词100英文带翻译_老人与海英文读后感100字
  18. 浮点数(float和double)在计算机底层的存储机制
  19. 酷~史上超全的安全思维导图
  20. OKR团队绩效管理学习1

热门文章

  1. 钉钉和微信通过h5服务器对接,【案例】钉钉/企业微信/在线、工单等集成对接 | 网易七鱼...
  2. nodejs项目实战教程05——Nodejs中的fs模块
  3. 函数式编程另类指南 (转载)
  4. 不拘一格-网飞的自由与责任工作法
  5. Unity内存与资源管理
  6. vue3中keep-alive及include/exclude的使用
  7. 20-python学习笔记之日期
  8. android 取消选择图片会闪退或者报错
  9. 攻防世界crypto高手题之sherlock
  10. MPAndroidChart使用(个人笔记)