当前位置: 首页 > news >正文

行为模式---迭代器模式

概念

迭代器模式是设计模式的行为模式,它的主要设计思想是提供一个可以操作聚合对象(容器或者复杂数据类型)表示(迭代器类)。通过迭代器类去访问操作聚合对象可以隐藏内部表示,也可以使客户端可以统一处理不同类型的家具和对象。

适应场景

1、当内部集合的数据结构很复杂并且不希望外部调用知道数据结构的数据组成的时候可以使用迭代器模式。

2、当程序中有很多的重复遍历代码的时候,可以使用迭代器模式减伤代码量,保证程序的易读性。

3、当代码能够用遍历不同的甚至是无法预知的数据结构时,可以使用迭代器模式。

实现方式

1、使用迭代器模式,我们需要创建两个类,一个是迭代器接口类,一个是容器类。

2、声明迭代器接口的时候,需要注意该接口必须提供至少一个方法来获取集合中的下个元素。也可以实现其他的接口(例如:添加数据接口、获取最后一个、获取第一个和元素数目等。)。

3、声明聚合对象接口的时候,需要实现一个接口用于创建对应的迭代器的方法,其返回值必须是对应的迭代器对象。如果有需求使用其他的迭代器,可以多添加几个创建迭代器的方法。

4、创建具体的迭代器类,在创建迭代器类的时候除了实现迭代器接口中的方法之外,还需要在构造函数进行迭代器和容器的关联。

5、创建具体的容器类,除了需要实现容器类的接口之外,还需要实现容器中的具体存储方式,例如是通过数据还是链表进行数据存储。具体的集合对象在创建迭代器时候必须将自己传递给迭代器来创建迭代器和容器之间的连接。

6、到处迭代器模式基本完成,在客户端使用的时候需要先创建容器,向容器中写入数据,之后在创建迭代器,创建迭代器之后就可以通过迭代器操作容器了。

类关系图

在这里插入图片描述

示例代码

#include "MingLingMoShi.h"

int main()
{
    std::cout << "欢迎东哥来到设计模式的世界!\n";

    //创建命令对象
    CommandBase* command = new ConcreteCommend();
    CommandBase* command1 = new ConcreteCommend1();

    //创建调用者
    Invoker invoker;
    invoker.setCommend(command);
    invoker.execte();
    invoker.setCommend(command1);
    invoker.execte();
}
#pragma once
#include <iostream>
using namespace std;

//接受者类
class Receiver {
public:
	Receiver() {}
	~Receiver() {}
	void execte() {
		cout << "Receiver 接收者对象执行操作函数" << endl;
	}
};

//命令基类
class CommandBase
{
public:
	CommandBase() {}
	~CommandBase() {}
	virtual bool execte() = 0;
};

//具体命令,不使用接受者
class ConcreteCommend : public CommandBase {
public:
	ConcreteCommend() {}
	~ConcreteCommend() {}
	bool execte() {
		cout << "ConcreteCommend 没有使用接受者的命令对象" << endl;
		return true;
	}
};

//具体命令,使用接受者
class ConcreteCommend1 : public CommandBase {
public:
	ConcreteCommend1() {}
	~ConcreteCommend1() {}
	bool execte() {
		cout << "ConcreteCommend1 使用接受者的命令对象" << endl;
		m_receiver = new Receiver();
		m_receiver->execte();
		return true;
	}
private:
	Receiver* m_receiver;
};

//调用者
class Invoker {
public:
	Invoker() {}
	~Invoker() {}
	void setCommend(CommandBase * command) {
		m_command = command;
	}
	void execte() {
		m_command->execte();
	}
private:
	CommandBase* m_command;

};

相关文章:

  • MySQL 主主复制与 Redis 环境安装部署
  • 开发模型与测试模型
  • 原码、反码和补码的介绍和区别
  • pycharm找不到conda可执行文件
  • 系统架构设计师—数据库基础篇—数据库的控制功能
  • 【形态学操作中的开运算和闭运算详细讲解】
  • Windows设置目录及子目录大小写不敏感暨git克隆报错同名文件已存在的解决办法
  • Flink MysqlCDC和OracleCDC对比
  • 虚拟卡 WildCard (野卡) 保姆级开卡教程
  • QT day5
  • 当夸克让搜索学会深度思考,AI搜索掀开新篇章
  • 分布式ID生成方案:数据库号段、Redis与第三方开源实现
  • 代码随想录算法训练营第35天 | 01背包问题二维、01背包问题一维、416. 分割等和子集
  • 【芯片设计】处理器芯片大厂前端设计工程师面试记录·20250307
  • ClickHouse 中出现 DB::Exception: Too many parts 错误
  • 什么是向量数据库?向量数据库概念,详细入门
  • 【五.LangChain技术与应用】【26.LangChain Agent基础应用(上):智能代理的构建】
  • 护照阅读器在机场流程中的应用
  • MATLAB中lookAheadBoundary函数用法
  • TWind 的黑马点评随笔
  • b2b网站推广/百度免费发布信息
  • 武汉网站模板建站/专业全网优化
  • 武汉哪家做网站/搜索引擎排名规则
  • java免费入门网站/企业推广网
  • 网站建站 优化推广/凡科建站登录
  • 做百度词条需要哪些网站/怎么快速推广app