手机访问 | 设为首页 | 加入收藏 | 网站地图

当前位置:电脑中国 > 编程 > PHP教程 >

php迭代器模式

2016-11-02 10:31|来源:未知 |作者:dnzg |点击:

1 模式介绍

提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。

2 模式中的角色

2.1 抽象容器:一般是一个接口,提供一个iterator()方法,例如java中的Collection接口,List接口,Set接口等。
2.2 具体容器:就是抽象容器的具体实现类,比如List接口的有序列表实现ArrayList,List接口的链表实现LinkList,Set接口的哈希列表的实现HashSet等。
2.3 抽象迭代器:定义遍历元素所需要的方法,一般来说会有这么三个方法:取得第一个元素的方法first(),取得下一个元素的方法next(),判断是否遍历结束的方法isDone()(或者叫hasNext()),移出当前对象的方法remove(),
2.4 迭代器实现:实现迭代器接口中定义的方法,完成集合的迭代。  

3 模式结构

4 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
<!--?php
/**
 * 迭代器模式
 * copyright (c) http://blog.csdn.net/CleverCode 
 */
 
//我的迭代器标准
interface MyIterator
{/*{{{*/
    //首个
    public function first();
    //下一个
    public function next();
    //是否结束
    public function isDone();
    //当前元素
    public function currentItem();
    //当前指针
    public function currentIdx();
}/*}}}*/
 
//抽象的容器
abstract class Aggregate
{/*{{{*/
    abstract public function createIterator();
}/*}}}*/
 
//具体的容器
class MyAggregate extends Aggregate
{/*{{{*/
    public $items = array();
 
    //容器的迭代器
    public function createIterator()
    {
        return new MineIterator($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 MyIterator
{/*{{{*/
    //容器【聚集对象】
    private $aggregate;
    private $current = 0;
 
    public function __construct(MyAggregate $aggregate)
    {
        $this->aggregate = $aggregate;
    }
 
    //首个
    public function first()
    {
        return $this->aggregate->getItem(0);
    }
 
    //下一个
    public function next()
    {
        $ret = null;
        $this->current++;
        if($this->current < $this->aggregate->getCount())
        {
            $ret = $this->aggregate->getItem($this->current);
        }
 
        return $ret;
    }
 
    //是否结束
    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;
    }
 
}/*}}}*/
 
class Client
{/*{{{*/
    public static function main($argv)   
    {
        //创建一个容器
        $myAggregate = new MyAggregate();
 
        //向容器中添加元素
        $myAggregate->setItem(0,'张三');
        $myAggregate->setItem(1,'李四');
        $myAggregate->setItem(2,'王五');
 
        //给容器创建迭代器
        $iterator = $myAggregate->createIterator();
 
        //遍历
        while(!$iterator->isDone())
        {
            $idx = $iterator->currentIdx();
            $item = $iterator->currentItem();
            echo "当前位置:{$idx},值:{$item}\r\n";
            $iterator->next();
 
        }
 
    }
}/*}}}*/
 
Client:: main($argv);
 
?>
(责任编辑:dnzg)
图片推荐
    友荐云推荐
网友评论