首页 > 其他分享 >迭代器模式

迭代器模式

时间:2022-11-29 23:14:09浏览次数:32  
标签:遍历 ag idx 模式 public virtual 迭代

1. 迭代器模式简介

        把对容器中包含的内部对象的访问委让给外部类,使用 Iterator(遍历)按顺序进行遍历访问的设计模式。       如果不使用 Iterator 模式,会存在什么问题:          1.由容器自己实现顺序遍历。直接在容器类里直接添加顺序遍历方法                缺点:  容器类承担了太多功能:一方面需要提供添加删除等本身应有的功能;一方面还需要提供遍历访问功能。          2.让调用者自己实现遍历。直接暴露数据细节给外部。               缺点:往往容器在实现遍历的过程中,需要保存遍历状态,当跟元素的添加删除等功能夹杂在一起,很容易引起混乱和程序运行错误等。

2. 案例

         迭代器能访问的本质:在迭代器中 持有 一个集合的 引用;所以通过迭代器,就可以访问集合。

  1 #include <iostream>
  2 using namespace std;
  3 typedef int Object ;
  4 #define SIZE 5
  5 
  6 //注意类的顺序
  7 class MyIterator   //迭代器接口
  8 {
  9 public:
 10     virtual void First() = 0;
 11     virtual void Next() = 0;
 12     virtual bool IsDone() = 0;
 13     virtual Object CurrentItem() = 0;
 14 };
 15 
 16 class Aggregate  //容器接口
 17 {
 18 public:
 19     virtual Object getItem(int index) = 0;
 20     virtual MyIterator *CreateIterator() = 0;  //创建迭代器
 21     virtual int getSize() = 0;
 22 };
 23 
 24 //具体的迭代器类
 25 class ContreteIterator : public MyIterator
 26 {
 27 public:
 28     ContreteIterator(Aggregate *ag)
 29     {
 30         _ag = ag;
 31         _idx = 0;
 32     }
 33     ~ContreteIterator()
 34     {
 35         _ag = NULL;
 36         _idx = 0;
 37     }
 38     virtual void First()
 39     {
 40         _idx = 0;
 41     }
 42     virtual void Next()
 43     {
 44         if (_idx < _ag->getSize())
 45         {
 46             _idx ++;
 47         }
 48     }
 49     virtual bool IsDone()
 50     {
 51         return (_idx == _ag->getSize());
 52     }
 53     virtual Object CurrentItem()
 54     {
 55         return _ag->getItem(_idx);
 56     }
 57 protected:
 58 private:
 59     int _idx;
 60     Aggregate *_ag;  //在迭代器中 持有 一个集合的 引用;所以通过迭代器,就可以访问集合
 61 };
 62 
 63 //具体的容器类
 64 class ConcreteAggregate : public Aggregate
 65 {
 66 public:
 67     ConcreteAggregate()
 68     {
 69         for (int i=0; i<SIZE; i++)
 70         {
 71             object[i] = i+1;
 72         }
 73     }
 74     virtual ~ConcreteAggregate()
 75     {
 76     }
 77     virtual Object getItem(int index)
 78     {
 79         return object[index];
 80     }
 81     virtual MyIterator *CreateIterator()
 82     {
 83         return new ContreteIterator(this); //创建迭代器
 84     }
 85     virtual int getSize()
 86     {
 87         return SIZE;
 88     }
 89 protected:
 90 private:
 91     Object object[SIZE];
 92 };
 93 
 94 int main()
 95 {
 96     // 创建一个集合
 97     Aggregate *ag = new ConcreteAggregate();
 98     // 创建一个遍历这个集合的 迭代器
 99     MyIterator *it = ag->CreateIterator();
100     //通过迭代器 遍历 集合
101     for (; !(it->IsDone()); it->Next() )
102     {
103         cout << it->CurrentItem() << " ";
104     }
105     //清理相关资源
106     delete it;
107     delete ag;
108     return 0;
109 }

 

 

 

标签:遍历,ag,idx,模式,public,virtual,迭代
From: https://www.cnblogs.com/dkhlaojogo/p/16937020.html

相关文章

  • 适配器模式
    1. 适配器模式简介   将一个类的接口转换成客户希望的另外一个接口。使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。2. 案例    需要使......
  • 企业办公新模式,随时随地云上协同!
    如今,越来越多人参与到项目中进行协同,因此对企业内部的协同办公提出了更高的要求,同时加之大环境下的居家办公要求,导致很多人一回到家之后就会出现无电脑可用、没有办公室电脑......
  • 单例模式
    1.单例模式简介  (1)多线程模式下,共享同一个资源或者操作同一个资源,单例模式保证一个类只生成唯一的一个对象      例如:多个线程使用同一个socket资源;配置......
  • 策略模式
    风带着万物全部飘散,可那飘散的不是万物,而是我的青春一个简单的鸭子应用使用简单继承的模式实现多个不同的鸭子实现类。新需求-鸭子能飞现在公司为了甩开其他竞争......
  • 设计模式之解释器模式
    文法规则和抽象语法树解释器模式描述了如何为简单的语言定义一个文法,如何在该语言中表示一个句子,以及如何解释这些句子。在正式分析解释器模式结构之前,先来学习如何表示一......
  • (十六)状态模式
    1概述状态模式(State),当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的......
  • C#设计模式读书笔记之设计模式的设计原则
    设计模式的设计原则:(重要性从上往下排列)开闭原则:对扩展开放,对修改关闭依赖倒转原则:高层模块不应该依赖底层模块,它们都应该依赖抽象;要针对抽象层编程,而不要针对具体类编程。......
  • Docker使用Calico网络模式配置及问题处理
    一.Calico介绍Calico是一种容器之间互通的网络方案,在虚拟化平台中,比如OpenStack、Docker等都需要实现workloads之间互连,但同时也需要对容器做隔离控制,就像在Internet中的......
  • 安卓设计模式演变之经典三层模型(MVC/MVP/MVVM)
    转载请标明出处!先看代码demo再回看文章效果最佳!目录​​一mvc​​​​1.1概述​​​​1.2 作用流程​​​​1.3 现状​​​​1.4致命弱点/缺点:​​​​1.5 代码Demo​......
  • 代码随想录算法训练营第十四天 | 理论基础 递归遍历 迭代遍历 统一迭代
    今日内容:●理论基础●递归遍历●迭代遍历●统一迭代详细布置理论基础需要了解二叉树的种类,存储方式,遍历方式以及二叉树的定义文章讲解:https://pro......