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

四、优缺点总结

优点:

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

缺点:

  • 增加复杂度:对于简单集合可能过于复杂
  • 性能开销:迭代器对象创建和虚函数调用可能带来开销
  • 可能破坏封装:某些迭代器可能需要访问聚合内部细节
相关推荐
蒸蒸yyyyzwd7 小时前
面经学习笔记
c++·面试·八股
影视飓风TIM8 小时前
C++11 新特性:Lambda表达式、std::function与std::bind
开发语言·c++
vivo互联网技术8 小时前
软件不是从数据开始,而是从现实开始 | KDC 系列 01
设计模式·架构·领域驱动设计
欧特克_Glodon8 小时前
OpenCV计算机视觉开发入门与实践<三十六>:机器学习概述
c++·opencv·机器学习·计算机视觉
小七在进步8 小时前
C++入门(3)
android·java·c++
码匠许师傅8 小时前
【设计模式精讲】27.模板方法模式(Template Method)
c++·设计模式·uml·模板方法模式
王老师青少年编程8 小时前
信奥赛csp初赛高频考点【排序算法】(详细解析)
c++·排序算法·csp-j·csp·高频考点·初赛·信奥赛
qeen878 小时前
【C++】C++中的错误处理机制-异常
开发语言·c++·异常
Zixhy9 小时前
Boost 库实现异步高并发服务器
linux·服务器·c++
AbandonForce9 小时前
简谈线程池
开发语言·c++·算法