-
Notifications
You must be signed in to change notification settings - Fork 1
/
10-迭代器模式.php
148 lines (122 loc) · 3.13 KB
/
10-迭代器模式.php
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
<?php
declare(strict_types=1);
/*
* This file is modified from `xiaohuangniu/26`.
*
* @see https://github.com/xiaohuangniu/26
*/
header('Content-type: text/html; charset=utf-8');
/**
* 接口 迭代器.
*/
interface IIterator
{
public function First(); // 首元素
public function Next(); // 下一个元素
public function IsDone(); // 是否已结束
public function CurrentItem(); // 当前元素
public function CurrentIdx(); // 当前指针
}
/**
* 抽象 容器.
*/
abstract class Aggregate
{
protected $IIter; // 迭代器的实例
/**
* 选择容器对应的迭代器.
* @param mixed $New
*/
public function __construct($New)
{
$this->IIter = $New;
}
/**
* 将容器的this传给 迭代器,并返回迭代器的当前实例.
*/
abstract public function CreateIterator();
}
/**
* 创建一个 - 具体容器.
*/
class MyAggregate extends Aggregate
{
public $Items = [];
// 数据存储内容
// 容器的迭代器
public function CreateIterator()
{
return $this->IIter->GetAg($this);
}
// 获得指定容器内容
public function GetItem($idx)
{
return isset($this->Items[$idx]) ? $this->Items[$idx] : null;
}
// 修改容器内容
public function SetItem($idx, $val)
{
$this->Items[$idx] = $val;
}
// 获得容器内容长度
public function GetCount()
{
return count($this->Items);
}
}
/**
* 创建一个 - 具体迭代器.
*/
class MineIterator implements IIterator
{
// 容器【聚集对象】
private $aggregate; // 容器的实例
private $current = 0; // 容器内的数据长度
// 为迭代器注入容器
public function GetAg($aggregate)
{
$this->aggregate = $aggregate;
return $this;
}
// 获取首元素
public function First()
{
return $this->aggregate->GetItem(0);
}
// 下一个元素内容
public function Next()
{
++$this->current;
// 在这一步你也可以设置成指针向下,并获取下一个元素内容
}
// 是否已结束 - 已无内容
public function IsDone()
{
return ($this->current >= $this->aggregate->GetCount()) ? true : false;
}
// 获取当前元素
public function CurrentItem()
{
return $this->aggregate->GetItem($this->current);
}
// 获取当前元素长度
public function CurrentIdx()
{
return $this->current;
}
}
// 创建一个容器
$myAggregate = new MyAggregate(new MineIterator());
// 向容器中添加元素
$myAggregate->SetItem(0, '小黄牛');
$myAggregate->SetItem(1, '小黄狗');
$myAggregate->SetItem(2, '小黄猪');
// 迭代器注入容器内容
$iterator = $myAggregate->CreateIterator();
// 还有内容,就一直遍历
while (!$iterator->IsDone()) {
$idx = $iterator->CurrentIdx(); // 获得元素当前位置长度
$item = $iterator->CurrentItem(); // 获取当前元素内容
echo "当前位置:{$idx},值:{$item}".PHP_EOL;
$iterator->Next(); // 将指针指向下一个元素,否则将会出现死循环
}