23种设计模式之(二十三)迭代器模式(Iterator)
本文主要介绍23种设计模式之迭代器模式,附详细python/c++示例代码。
- 概念
- 应用场景
- 注意事项
- 代码示例
- 总结
- 代码链接
迭代器模式(Iterator)
概念
迭代模式,是行为模式之一,它把对容器中包含的内部对象的访问委让给外部类,使用Iterator(遍历)按顺序进行遍历访问的设计模式。
迭代器模式就是为了有效地处理按顺序进行遍历访问的一种设计模式,简单地说,Iterator模式提供一种有效的方法,可以屏蔽聚集对象集合的容器类的实现细节,而能对容器内包含的对象元素按顺序进行有效的遍历访问。
GoF对迭代器模式的定义是:提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。
应用场景
(1)、访问一个聚合对象的内容而无须暴露它的内部表示。
(2)、需要为聚合对象提供多种遍历方式。
(3)、为遍历不同的聚合结构提供一个统一的接口。
C++代码示例
/************************************************************************/
/* 设计模式专题
/*
/* 迭代器模式
/*
/* Author : zzl
/*
/* 编程环境: window10 vs2010
/*
/* Date : 20180918
/************************************************************************/
#include <iostream>
typedef int Object ;
#define SIZE 5
class MyIterator
{
public:
virtual void First() = 0;
virtual void Next() = 0;
virtual bool IsDone() = 0;
virtual Object CurrentItem() = 0;
};
class Aggregate
{
public:
virtual MyIterator *CreateIterator() = 0;
virtual Object getItem(int index) = 0;
virtual int getSize() = 0;
};
class ContreteIterator : public MyIterator
{
public:
ContreteIterator(Aggregate *ag)
{
_ag = ag;
_current_index = 0;
}
virtual void First()
{
_current_index = 0; //让当前 游标 回到位置0
}
virtual void Next()
{
if (_current_index < _ag->getSize())
{
_current_index ++;
}
}
virtual bool IsDone()
{
return (_current_index == _ag->getSize());
}
virtual Object CurrentItem()
{
return _ag->getItem(_current_index);
}
protected:
private:
int _current_index;
Aggregate *_ag;
};
class ConcreteAggregate : public Aggregate
{
public:
ConcreteAggregate()
{
for (int i=0; i<SIZE; i++)
{
object[i] = i + 100;
}
}
virtual MyIterator *CreateIterator()
{
return new ContreteIterator(this); //让迭代器 持有一个 集合的 引用
}
virtual Object getItem(int index)
{
return object[index];
}
virtual int getSize()
{
return SIZE;
}
private:
Object object[SIZE];
};
void main()
{
Aggregate * ag = new ConcreteAggregate;
MyIterator *it = ag->CreateIterator();
for (; !(it->IsDone()); it->Next() )
{
printf ("%d ",it->CurrentItem());
}
delete it;
delete ag;
}
python代码示例
# -*- coding: utf-8 -*-
###################################################################
# 设计模式专题
#
# 迭代器模式
#
# Author : zzl
#
# 编程环境: window10 python2.7
#
# Date : 20180918
##################################################################
# python语言本身对可迭代对象有良好的支持,只要对象定义了可以返回一个迭代器的__iter__方法,
# 或者定义了可以支持下标索引的__getitem__方法(这些双下划线方法会在其他章节中全面解释),那么它就是一个可迭代对象。
class Aggregate(object):
def __init__(self, data):
self.data = data
self.index = len(data)
def __iter__(self):
return self
def next(self):
if self.index == 0:
raise StopIteration
self.index = self.index - 1
return self.data[self.index]
if __name__ == "__main__":
from collections import Iterable
agg = Aggregate([100, 200, 300, 400])
for obj in agg:
print(obj)