设计模式(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;
}

四、优缺点总结

优点:

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

缺点:

  • 增加复杂度:对于简单集合可能过于复杂
  • 性能开销:迭代器对象创建和虚函数调用可能带来开销
  • 可能破坏封装:某些迭代器可能需要访问聚合内部细节
相关推荐
tjl521314_217 小时前
01C++ 类定义与访问控制(封装)
java·开发语言·c++
c++之路18 小时前
C++信号处理
开发语言·c++·信号处理
故事还在继续吗20 小时前
C++20关键特性
开发语言·c++·c++20
青少儿编程课堂20 小时前
2026青少儿信息素养大赛备赛指南!Python/Scratch/C++备考要点
开发语言·c++·python
旖-旎21 小时前
深搜练习(电话号码字母组合)(3)
c++·算法·力扣·深度优先遍历
AIFarmer21 小时前
【无标题】
开发语言·c++·算法
huzhongqiang21 小时前
Python 单例模式的几种实现方式:朴素才是王道
设计模式
John_ToDebug21 小时前
WebHostView 与 TabStrip 交互机制深度解析
c++·chrome·windows
南境十里·墨染春水1 天前
C++笔记 STL——set
开发语言·c++·笔记