首页 > 其他分享 >“数据结构”模式之迭代器(Iterator)模式

“数据结构”模式之迭代器(Iterator)模式

时间:2023-12-03 21:33:25浏览次数:32  
标签:std 迭代 Iterator int 模式 数据结构 data class

常常有一些组件在内部具有特定的数据结构,如果让客户程序依赖这些特定的数据结构,将极大地破坏组件的复用。这时候,将这些特定数据结构封装在内部,在外部提供统一的接口,来实现与特定数据结构无关的访问,是一种行之有效的解决方案。

典型模式:

  • Composite
  • Iterator
  • Chain of Resposibility

1 模式动机

在软件构建过程中,集合对象内部结构常常变化各异。但对于这些集合对象,我们希望在不暴露其内部结构(比如树、堆、栈等等)的同时,可以让外部客户代码透明地访问其中包含的元素;同时这种“透明遍历"也为“同一种算法在多种集合对象上进行操作”提供了可能。

 

 

2 模式定义

提供—种方法顺序访问一个聚合对象中的各个元素,而又不暴露(稳定)该对象的内部表示。

 

3 模式结构

 

4 代码示例 

/**
 * Iterator Design Pattern
 *
 * Intent: Lets you traverse elements of a collection without exposing its
 * underlying representation (list, stack, tree, etc.).
 */

#include <iostream>
#include <string>
#include <vector>

/**
 * C++ has its own implementation of iterator that works with a different
 * generics containers defined by the standard library.
 */

template <typename T, typename U>
class Iterator {
 public:
  typedef typename std::vector<T>::iterator iter_type;
  Iterator(U *p_data, bool reverse = false) : m_p_data_(p_data) {
    m_it_ = m_p_data_->m_data_.begin();
  }

  void First() {
    m_it_ = m_p_data_->m_data_.begin();
  }

  void Next() {
    m_it_++;
  }

  bool IsDone() {
    return (m_it_ == m_p_data_->m_data_.end());
  }

  iter_type Current() {
    return m_it_;
  }

 private:
  U *m_p_data_;
  iter_type m_it_;
};

/**
 * Generic Collections/Containers provides one or several methods for retrieving
 * fresh iterator instances, compatible with the collection class.
 */

template <class T>
class Container {
  friend class Iterator<T, Container>;

 public:
  void Add(T a) {
    m_data_.push_back(a);
  }

  Iterator<T, Container> *CreateIterator() {
    return new Iterator<T, Container>(this);
  }

 private:
  std::vector<T> m_data_;
};

class Data {
 public:
  Data(int a = 0) : m_data_(a) {}

  void set_data(int a) {
    m_data_ = a;
  }

  int data() {
    return m_data_;
  }

 private:
  int m_data_;
};

/**
 * The client code may or may not know about the Concrete Iterator or Collection
 * classes, for this implementation the container is generic so you can used
 * with an int or with a custom class.
 */
void ClientCode() {
  std::cout << "________________Iterator with int______________________________________" << std::endl;
  Container<int> cont;

  for (int i = 0; i < 10; i++) {
    cont.Add(i);
  }

  Iterator<int, Container<int>> *it = cont.CreateIterator();
  for (it->First(); !it->IsDone(); it->Next()) {
    std::cout << *it->Current() << std::endl;
  }

  Container<Data> cont2;
  Data a(100), b(1000), c(10000);
  cont2.Add(a);
  cont2.Add(b);
  cont2.Add(c);

  std::cout << "________________Iterator with custom Class______________________________" << std::endl;
  Iterator<Data, Container<Data>> *it2 = cont2.CreateIterator();
  for (it2->First(); !it2->IsDone(); it2->Next()) {
    std::cout << it2->Current()->data() << std::endl;
  }
  delete it;
  delete it2;
}

int main() {
  ClientCode();
  return 0;
}

 

输出结果:

________________Iterator with int______________________________________
0
1
2
3
4
5
6
7
8
9
________________Iterator with custom Class______________________________
100
1000
10000

 

 

参考:https://refactoringguru.cn/design-patterns/iterator

标签:std,迭代,Iterator,int,模式,数据结构,data,class
From: https://www.cnblogs.com/spacerunnerZ/p/17873828.html

相关文章

  • 设计模式之七大原则
    单一职责原则类的职责要单一,不能将太多的职责放在一个类中。请看代码示例:未采用单一职责原则packagecom.std.www.designPattern.principle;classStudent{publicvoidgetDBConnection(){System.out.println("连接到数据库");}publicvoidaddStu......
  • stl中迭代器的删除
    Z1584.noip题海战Description某校举行了k场集训,集训有两种方式:比赛和训练对于每场比赛,他要保证所出的所有试题,对于所有学生来说,都是从来没有做过的而对于每场训练,他要保证所出的所有题都被每一个参赛学生做过。FormatInput第一行2个正整数n和m,表示学生数和试题总数第2~n+1行......
  • python 解压可迭代对象赋值给多个变量
    1.2解压可迭代对象赋值给多个变量问题如果一个可迭代对象的元素个数超过变量个数时,会抛出一个ValueError。那么怎样才能从这个可迭代对象中解压出N个元素出来?解决方案Python的星号表达式可以用来解决这个问题。比如,你在学习一门课程,在学期末的时候,你想统计下家庭作业......
  • “接口隔离模式”之外观模式(门面模式)
    1模式动机外观模式属于“接口隔离模式”的一种。  下图中,A方案的问题在于组件的客户和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种过多的耦合面临很多变化的挑战。如何简化外部客户程序和系统间的交互接口?如何将外部客户程序的演化和内......
  • 设计模式
    设计模式分创建型、结构型、行为型模式,以下是详述创建型模式隐藏了创建对象的过程,通过逻辑方法创建对象,而不是通过new关键字*工厂方法模式*抽象工厂模式*单例模式*建造者模式*原型模式结构型模式主要关注类和对象的组合关系继承的概念......
  • JavaScript的设计模式—构造器模式
    设计模式介绍设计模式是我们在解决问题的时候针对特定问题给出的简洁而优化的处理方案在JS设计模式,最核心的思想:封装变化将变与不变分离,确保变化的部分灵活,不变的部分稳定构造器模式varemployee1={name:'Kerwin',age:100}varemployee2={name:'xiaoming',......
  • 使用分布式事务 Seata 的 XA 模式
    上篇博客已经搭建了分布式事务Seata的集群,本篇博客主要介绍如何使用Seata的XA模式。XA模式的规范是X/Open组织定义的分布式事务处理(DTP,DistributedTransactionProcessing)标准,XA模式规范描述了全局的TM与局部的RM之间的接口,几乎所有主流关系型数据库都对XA模式......
  • 23种设计模式——单例模式
    今天来学习23种设计模式的第一种,单例模式,同时也是设计模式中最简单的模式之一。概念:所谓类的单例模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)。特点:单例类只有一个实例对象;该单例对象必......
  • 设计模式--观察者模式(Observer Pattern)
    Observer模式观察者模式(ObserverPattern)是一种行为设计模式,它定义了对象之间的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。观察者模式主要包含以下几个角色:Subject(主题):也被称为Observable,它是被观察的对象。当它的状态发生改变时,会通知......
  • 小谈设计模式(9)—工厂方法模式
    (小谈设计模式(9)—工厂方法模式)专栏介绍专栏地址link专栏介绍主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。工厂方法模式工厂方法模式是一种创建型设计模式,它定义了一......