迭代器模型
随着消费观的变化,冰淇淋的无人销售变得很有吸引力。
现在有一个问题:无人贩卖机怎么实现按顺序依次卖完某种冰淇淋,并在卖完后告知用户?
# 场景分析
这里简化一下规则,假设贩卖机只贩卖一种冰淇淋。
贩卖机的规则:
1、依次售卖,向用户提供冰淇淋。
2、不能直接让用户打开去拿冰淇淋。
3、当冰淇淋销售完,显示无货。
这里,迭代器就比较合适。
# 实现
# Aggregate
Aggregate接口:
template<class Item>
class Aggregate
{
public:
Aggregate() {}
virtual ~Aggregate() {}
virtual void pushData(Item item) {}
virtual Iterator<Item>* createIterator() { return nullptr; }
virtual Item* operator[](int index) { return nullptr; }
virtual int getSize() { return 0; }
};
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
Aggregate接口实现:
#include "Aggregate.h"
#include <vector>
#include "ConcreteIterator.h"
template <class Item>
class ConcreteAggregate : public Aggregate<Item>
{
public:
ConcreteAggregate() {};
virtual ~ConcreteAggregate() {};
virtual void pushData(Item item) override;
virtual Iterator<Item>* createIterator() override;
virtual Item* operator[](int index);
virtual int getSize() override;
private:
std::vector<Item> data;
};
template <class Item>
void ConcreteAggregate<Item>::pushData(Item item)
{
data.push_back(item);
}
template <class Item>
Iterator<Item>* ConcreteAggregate<Item>::createIterator()
{
return new ConcreteIterator<Item>(this);
}
template <class Item>
Item* ConcreteAggregate<Item>::operator[](int index)
{
return &data.at(index);
}
template <class Item>
int ConcreteAggregate<Item>::getSize()
{
return data.size();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# Iterator
Iterator接口:
#include "Aggregate.h"
template<class Item>
class Iterator
{
public:
Iterator() {}
virtual ~Iterator() {}
virtual void first() {}
virtual void next() {}
virtual Item* curItem() { return nullptr; }
virtual bool hasNext() { return false; }
};
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
Iterator接口实现:
#include "Iterator.h"
#include "Aggregate.h"
template<class Item>
class ConcreteIterator : public Iterator<Item>
{
public:
ConcreteIterator(Aggregate<Item> *a) : aggr(a), cur(0) {}
virtual ~ConcreteIterator(){}
virtual void first() override;
virtual void next() override;
virtual Item* curItem() override;
virtual bool hasNext() override;
private:
Aggregate<Item>* aggr;
int cur;
};
template<class Item>
void ConcreteIterator<Item>::first()
{
cur = 0;
}
template<class Item>
void ConcreteIterator<Item>::next()
{
if (cur < aggr->getSize())
cur++;
}
template<class Item>
Item* ConcreteIterator<Item>::curItem()
{
if (cur < aggr->getSize())
{
return (*aggr)[cur];
}
else
{
return nullptr;
}
}
template<class Item>
bool ConcreteIterator<Item>::hasNext()
{
return cur >= aggr->getSize();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# main函数
int main(int argc, char* argv[])
{
Aggregate<std::string>* aggr = new ConcreteAggregate<std::string>();
aggr->pushData("草莓冰淇淋1");
aggr->pushData("草莓冰淇淋2");
aggr->pushData("香草冰淇淋2");
Iterator<std::string>* it = aggr->createIterator();
for (it->first(); !it->hasNext(); it->next())
{
std::cout << *it->curItem() << std::endl;
}
delete it;
delete aggr;
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 仓库
仓库位置:https://github.com/su-dd/demo.git (opens new window)
代码位置:设计模式/Iterator (opens new window)
# 感悟
迭代器模式又叫游标模式是一种常见模式,行为型设计模式的一种。几乎每种语言,会实现自己的迭代器。
在代码编程中,常常需要聚合对象来存放一组数据;
迭代器可以依次访问聚合对象内部的各个元素,同时又不暴露聚合对象的内部表示;
一般做业务开发时,并不需要实现迭代器模式;如果需要做公共组件,基础组件时,封装迭代器可能会被使用。
编辑 (opens new window)
上次更新: 2023/04/09, 11:59:04