设计模式(C++)-行为型模式-迭代器模式

设计模式(C++)-行为型模式-迭代器模式

一、迭代器模式概述

迭代器模式(iterator pattern):是一种行为型设计模式,它提供一种方法顺序访问 一个聚合对象中的各个元素,而又不暴露其内部表示。
核心思想 :提供一种方法,可以顺序访问聚合对象中的元素,而不需要了解底层表示,将遍历逻辑从聚合对象中分离出来,实现了单一职责原则。
总结:

  • 提供一个统一的方法遍历对象,客户不用再考虑聚合的类型,使用一种方法就可以遍历对象了。
  • 隐藏了聚合的内部结构,客户端要遍历聚合的时候只能取到迭代器,而不会知道聚合的具体组成。
  • 提供了一种设计思想,就是一个类应该只有一个引起变化的原因(叫做单一责任原则)。在聚合类中,我们把迭代器分开,就是要把管理对象集合和遍历对象集合的责任分开,这样一来集合改变的话,只影响到聚合对象。而如果遍历方式改变的话,只影响到了迭代器。
  • 当要展示一组相似对象,或者遍历一组相同对象时使用, 适合使用迭代器模式

二、迭代器模式UML类图

三、代码实现

cpp 复制代码
//Iterator.h
#pragma once
/*Iterator 模式(迭代器模式)
迭代器模式是一种设计模式,它提供了一种方法来顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示
总结:
- 提供一个统一的方法遍历对象,客户不用再考虑聚合的类型,使用一种方法就可以遍历对象了。
- 隐藏了聚合的内部结构,客户端要遍历聚合的时候只能取到迭代器,而不会知道聚合的具体组成。
- 提供了一种设计思想,就是一个类应该只有一个引起变化的原因(叫做单一责任原则)。在聚合类中,我们把迭代器分开,就是要把管理对象集合和遍历对象集合的责任分开,这样一来集合改变的话,只影响到聚合对象。而如果遍历方式改变的话,只影响到了迭代器。
- 当要展示一组相似对象,或者遍历一组相同对象时使用, 适合使用迭代器模式
*/
#include <iostream>
using namespace std;
//抽象的迭代器类
class Iterator {
public:
	virtual ~Iterator() {};
	virtual void first() = 0;
	virtual void next() = 0;
	virtual bool isDone() = 0;
	virtual int  currentItem() = 0;
};
//抽象聚合类
class Aggregate {
public:
	virtual ~Aggregate() {};
	virtual Iterator* createIterator() = 0;
};

//具体聚合类
class ConcreteIterator;
class ConcreteAggregate :public Aggregate {
public:
	ConcreteAggregate() {
		for (size_t i = 0; i < 5; i++)
		{
			item[i] = i;
		}
	}
	Iterator* createIterator()override;
	int getSize()const;
	int getItem(int index)const;
private:
	int item[5];
};

//具体迭代器
class ConcreteIterator :public Iterator {
public:
	ConcreteIterator(ConcreteAggregate*a):m_aggregate(a), m_current(0) {}
	virtual void first() override;
	virtual void next() override;
	virtual bool isDone() override;
	virtual int currentItem()override;
private:
	ConcreteAggregate* m_aggregate;
	int m_current;
};
void testIterator();

//Iterator.cc
#include "Iterator.h"
#include <memory>
Iterator* ConcreteAggregate::createIterator() {
	return new ConcreteIterator(this);
}
int ConcreteAggregate::getSize()const{
	return 5;
}
int ConcreteAggregate::getItem(int index)const{
	return item[index];
}
void ConcreteIterator::first() {
	m_current = 0;
}
void ConcreteIterator::next() {
	m_current++;
}
bool ConcreteIterator::isDone() {
	return m_current >= m_aggregate->getSize();
}
int ConcreteIterator::currentItem() {
	return m_aggregate->getItem(m_current);
}
void testIterator() {
	cout << "=================Iterator begin===============" << endl;
	std::shared_ptr<Aggregate> aggregate = std::make_shared<ConcreteAggregate>();
	Iterator* iterator = aggregate->createIterator();

	while (!iterator->isDone())
	{
		cout << iterator->currentItem() << " ";
		iterator->next();
	}
	cout << endl;
	cout << "=================Iterator end===============" << endl;
}

四、优缺点总结

优点:

  • 单一职责原则:将遍历算法与聚合对象分离
  • 开闭原则:可以新增迭代器类型而不修改聚合类
  • 并行遍历:可以在同一聚合上同时进行多个遍历
  • 延迟遍历:可以按需获取元素,不需要一次性加载所有数据
  • 统一接口:为不同的聚合结构提供统一的遍历接口

缺点:

  • 增加复杂度:对于简单集合可能过于复杂
  • 性能开销:迭代器对象创建和虚函数调用可能带来开销
  • 可能破坏封装:某些迭代器可能需要访问聚合内部细节
相关推荐
CodeYp20192 小时前
第15讲:二叉搜索树
开发语言·c++·二叉搜索树
pipixia200333 小时前
C++继承面试四连问:内存叠加、私有继承、sizeof、权限重映射
c++·面试·嵌入式·继承·面向对象·对象模型
昭昭日月明3 小时前
AI 时代的《重构》
设计模式·架构
牵猫散步的鱼儿5 小时前
C++ 内存分区
c++
choumin6 小时前
C++ 标准容器为什么不能存引用
c++·容器·引用类型
谙弆悕博士6 小时前
用 C 写了个 Windows 聊天室,踩了几个多线程和控制台的坑
c语言·开发语言·c++·windows·网络编程·聊天室
stolentime7 小时前
CF2277E Tree Guessing题解
c++·算法·贪心算法·交互·ad-hoc
syagain_zsx7 小时前
ODB 与 MySQL:C++ 里的 ORM 实践(类即表、事务铁律与查询封装)
开发语言·数据库·c++·mysql·工具库·1024程序员节
小鱼仙官7 小时前
使用Qt封装C/C++ 动态库 用于第三方调用
c语言·c++·qt
晚风予卿云月8 小时前
【C++高并发内存池】 1.定长内存池的实现
开发语言·c++·内存管理