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

 更新时间:2018年04月07日 08:36:07   作者:chencarl  
这篇文章主要为大家详细介绍了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根据其类型提供其取值、大小等的操作,那么对于使用者来说都是一样的操作。

应用场景

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

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

相关文章

  • C++静态持续变量介绍

    C++静态持续变量介绍

    这篇文章主要介绍了 C++静态持续变量,静态持续变量的定义C++和C语言是一样的,它拥有三种链接性,即外部链接性、内部连接性和无链接性。其中外部链接性指的是可以在其他文件中访问,内部链接性指的是只能在当前文件访问,需要的朋友可以参考一下
    2021-11-11
  • C++ Cartographer源码中关于MapBuilder的声明与构造

    C++ Cartographer源码中关于MapBuilder的声明与构造

    这篇文章主要介绍了C++ Cartographer源码中关于MapBuilder的声明与构造,前面已经谈到了Cartographer中添加轨迹的方法和传感器的数据流动走向。在添加轨迹的时候,除了添加位姿估计器还有采样器,订阅回调函数之外,最重要的是通过map_builder_bridge添加了一条轨迹
    2023-03-03
  • C++中putchar与getchar函数的细节及运用

    C++中putchar与getchar函数的细节及运用

    C语言提供putchar函数,用于给终端输出一个字符;getchar函数,可以从终端接收用户输入的一个字符,本文给大家分享C++中putchar与getchar函数的细节及运用,感兴趣的朋友跟随小编一起看看吧
    2021-07-07
  • 利用Matlab绘制甘特图的方法详解

    利用Matlab绘制甘特图的方法详解

    这篇文章主要为大家详细介绍了如何利用Matlab实现甘特图(gantt chart)的绘制,文中的示例代码讲解详细,对我们学习Matlab有一定帮助,需要的可以参考一下
    2022-10-10
  • 用C语言实现通讯录

    用C语言实现通讯录

    这篇文章主要为大家详细介绍了用C语言实现通讯录,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • c语言main函数使用及其参数介绍

    c语言main函数使用及其参数介绍

    这篇文章主要介绍了c语言main函数使用及其参数介绍,需要的朋友可以参考下
    2014-04-04
  • Qt实现简易毛玻璃效果的示例代码

    Qt实现简易毛玻璃效果的示例代码

    这篇文章主要介绍了Qt如何利用模糊功能实现简易的毛玻璃效果,并且鼠标可以移动无边框窗口,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-06-06
  • 如何基于C语言socket编程实现TCP通信

    如何基于C语言socket编程实现TCP通信

    本文介绍了如何基于C语言socket编程实现TCP通信,下面小编来简单介绍下
    2019-05-05
  • C语言内存泄漏常见情况及解决方案详解

    C语言内存泄漏常见情况及解决方案详解

    这篇文章主要为大家介绍了C语言内存泄漏常见情况及解决方案详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • vscode使用cmake时将命令行参数传递给调试目标的方法

    vscode使用cmake时将命令行参数传递给调试目标的方法

    这篇文章主要介绍了vscode使用cmake时将命令行参数传递给调试目标,下面介绍了一个示例,将参数first_arg, second-arg和third arg传递给程序(此处需要注意,third arg中间虽然存在空格,但是仍然被视作一个参数),需要的朋友参考下吧
    2024-03-03

最新评论