当前位置: 首页 > 编程笔记 >

C++设计模式之迭代器模式(Iterator)

韦熙云
2023-03-14
本文向大家介绍C++设计模式之迭代器模式(Iterator),包括了C++设计模式之迭代器模式(Iterator)的使用技巧和注意事项,需要的朋友参考一下

迭代器在STL运用广泛,类似容器的迭代已经成为其重要特性,而迭代器模式则是利用迭代器概念进行的抽象运用,迭代器模式运用广泛和有用,因为其能够不考虑数据的存储方式,而是直接面对数据进行迭代,也就是说我们不用考虑集合是数组(或vector)、链表、栈还是队列,而是通过统一的接口进行顺序的访问。

作用

迭代器模式提供了一种顺序访问容器中元素的方法,而无需了解器内部的类型和结构,该模式的核心思想将访问和遍历容器对象的功能交给一个外部的迭代器对象,该迭代器定义了访问聚合对象的接口,

类视图

实现

class Item
{
public:
  Item(string strName,float price):
  m_name(strName),m_price(price){}
  Item(Item& item):
  m_name(item.strName),m_price(item.price){}
    string tostring()
  {
    std::ostringstream buffer;
    buffer << f;
    string strPrice = buffer.str();
    strName += " :";
        return strName + strPrice;
  }
private:
  string m_name;
  float m_price;
}

class Container;
class Menu;

class Iterator
{
public:
  virtual ~Iterator(){}
  virtual void first()=0;
  virtual void next()=0;
  virtual bool hasnext()=0;
  virtual Item* current()=0;
protected:
  Container * m_pContainer;
}


class Container 
{
public:
  virtual ~Container() {};
  virtual void CreateIterator()= 0; 
protected:
  Observer(){};
};

class MenuIterator : public Iterator
{ 
  Menu * m_menu; 
  int curpos; 
public: 
  MenuIterator(Menu*a):m_menu(a),curpos(0){} 
  virtual void first() 
  { 
    curpos=0; 
  } 
  virtual void next() 
  { 
    curpos++; 
  } 
  virtual bool hasnext() 
  { 
    if(curpos >=0 && curpos< m_menu->size()) 
  } 
  virtual Item* current() 
  {
    return m_menu->value(curpos); 
  }
}; 


class Menu : public Container
{
public:
  virtual ~Menu() 
  {
    for(int i=0 ; i< m_items.size(); i++)
    {
      delete m_items[i];
    }
  };
  Iterator* CreateIterator() 
  {
    return new MenuIterator(this); 
  }
    int size()
  {
    return m_items.size();
  }
  Item* value(int nIndex)
  {
    if(nIndex>=0 && nIndex<m_items.size())
    {
      return m_items[nIndex];
    }
    else
    {
      return NULL;
    }
  }
  void additem(Item& item)
  {
    Item *pItem = new Item(item);
    m_items.push_back(pItem);
  }
    
private: 
  vector<item* > m_items; 
};


int main()
{
  Item it1("chicken", 10.0);
    Item it2("Apple", 5.0);
    Item it3("Beaf", 20.0);
    Item it4("soup",15.0);
    
    Menu menu;
  menu.additem(it1);
  menu.additem(it2);
  menu.additem(it3);
  menu.additem(it4);
  
    Iterator itor = menu.CreateIterator();
  while(itor->hasnext())
  {
    Item* pItem = itor->current();
    if(pItem)
      cout<<pItem->tostring()<<endl;
    itor->next();
  }
}

对于上例来说,Iterator接口是不变的,不管menu中的聚合内容的形式如何变化,只要menu根据其类型提供其取值、大小等的操作,那么对于使用者来说都是一样的操作。

应用场景

  • 访问一个聚合对象的内容而无需暴露它的内部表示;
  • 支持对聚合对象的多种遍历(从前到后,从后到前);
  • 为遍历不同的聚合结构提供一个统一的接口,支持多态迭代。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。

 类似资料:
  • 介绍 迭代器模式(Iterator):提供一种方法顺序一个聚合对象中各个元素,而又不暴露该对象内部表示。 迭代器的几个特点是: 访问一个聚合对象的内容而无需暴露它的内部表示。 为遍历不同的集合结构提供一个统一的接口,从而支持同样的算法在不同的集合结构上进行操作。 遍历的同时更改迭代器所在的集合结构可能会导致问题(比如C#的foreach里不允许修改item)。 正文 一般的迭代,我们至少要有2个方

  • 本文向大家介绍javascript设计模式之迭代器模式,包括了javascript设计模式之迭代器模式的使用技巧和注意事项,需要的朋友参考一下 迭代器模式分为内部迭代器和外部迭代器,内部迭代器就是在函数内部定义好迭代的规则,它完全接手整个迭代的过程,外部只需一次初始调用。 内部迭代器 以下自行实现的类似jquery中$.each()的each()函数就是内部迭代器 内部迭代器在调用时非常方便,但是

  • 迭代器(Iterator) Intent 提供一种顺序访问聚合对象元素的方法,并且不暴露聚合对象的内部表示。 Class Diagram Aggregate 是聚合类,其中 createIterator() 方法可以产生一个 Iterator; Iterator 主要定义了 hasNext() 和 next() 方法; Client 组合了 Aggregate,为了迭代遍历 Aggregate,也

  • 本文向大家介绍C++设计模式之代理模式,包括了C++设计模式之代理模式的使用技巧和注意事项,需要的朋友参考一下 前言 青春总是那样,逝去了才开始回味;大学生活也是在不经意间就溜走了,现在上班的时候,偶尔还会怀念大学时,大家在一起玩游戏的时光。大学喜欢玩游戏,但是可悲的校园网,速度能把人逼疯了;还好,后来搞了一个游戏代理,总算能勉勉强强的玩了两年。时至今日,敲起键盘写设计模式的时候,又想起了那些美好

  • 15.7 代理模式效果与适用场景        代理模式是常用的结构型设计模式之一,它为对象的间接访问提供了一个解决方案,可以对对象的访问进行控制。代理模式类型较多,其中远程代理、虚拟代理、保护代理等在软件开发中应用非常广泛。   15.7.1 模式优点        代理模式的共同优点如下:        (1) 能够协调调用者和被调用者,在一定程度上降低了系统的耦合度。        (2)

  • 15.4 远程代理       远程代理(Remote Proxy)是一种常用的代理模式,它使得客户端程序可以访问在远程主机上的对象,远程主机可能具有更好的计算性能与处理速度,可以快速响应并处理客户端的请求。远程代理可以将网络的细节隐藏起来,使得客户端不必考虑网络的存在。客户端完全可以认为被代理的远程业务对象是在本地而不是在远程,而远程代理对象承担了大部分的网络通信工作,并负责对远程业务方法的调用

  • 15.3 代理模式应用实例        下面通过一个应用实例来进一步学习和理解代理模式。        1. 实例说明        某软件公司承接了某信息咨询公司的收费商务信息查询系统的开发任务,该系统的基本需求如下:        (1) 在进行商务信息查询之前用户需要通过身份验证,只有合法用户才能够使用该查询系统;        (2) 在进行商务信息查询时系统需要记录查询日志,以便根据查

  •         代理模式是常用的结构型设计模式之一,当无法直接访问某个对象或访问某个对象存在困难时可以通过一个代理对象来间接访问,为了保证客户端使用的透明性,所访问的真实对象与代理对象需要实现相同的接口。根据代理模式的使用目的不同,代理模式又可以分为多种类型,例如保护代理、远程代理、虚拟代理、缓冲代理等,它们应用于不同的场合,满足用户的不同需求。   15.1 代理模式概述        近年来,