螃蟹学PHP设计模式之迭代器模式

9.迭代器模式

中午睡了一个半小时,现在可以上班了,趁着还没下班先把迭代器模式搞定。回顾上午学的解释器模式是比较简单易懂的,而下午的迭代器模式螃蟹也觉得是比较好理解的。就是循环输出对象集合时采用迭代器模式,来按顺序遍历数据,但是不需要暴露数据的内部表示,特别像在遍历数据库记录时,一般简单的螃蟹是直接通过函数读取字段来遍历,迭代器模式避免直接暴露字段,而把集合迭代成对象,更佳的面向对象编程方法。之前螃蟹做java集合迭代就用的这种方式。

参考项目模块:会员系统

迭代器应该是在整个项目开发中都用的很多,这里螃蟹就使用迭代器来遍历用户数据。

创建用户对象:User.class.php


<?php 
class User{
	public $id = 0;
	public $username = null;
	public $password = null;
	
	function __construct($user){
		$this->id = $user['id'];
		$this->username = $user['username'];
		$this->password = $user['password'];
	}
	
	public function output(){
		echo 'id:'.$this->id.'   username:'.$this->username.'     password:'.$this->password.'<br>';
	}
}
?>

创建用户迭代器:UserIterator.class.php

<?php 
require('User.class.php');

class UserIterator implements Iterator{
 	private $_users = array();
	private $_valid = FALSE;
	
	public function __construct($arr){
		for($i=0;$i<count($arr);$i++){
			$user_obj = new User($arr[$i]);
			array_push($this->_users,$user_obj);
		}
	}
	
	public function current () {
		return current($this->_users);
	}
	
	public function next () {
		$this->_valid = (next($this->_users)===FALSE)?FALSE:TRUE;
	}
	
	public function key () {
		return key($this->_users);
	}
	
	public function valid () {
		return $this->_valid;
	}
	
	public function rewind () {
		$this->_valid = (reset($this->_users)===FALSE)?FALSE:TRUE;
	}
	
}
?>



这里实现的是PHP自带的SPL标准Iterator接口,最后编写测试类:TestIterator.php
<?php 
require('UserIterator.class.php');

//模拟用户数据
$user=array();
$user[0]=array('id'=>1,'username'=>'螃蟹0','password'=>'ww123456');
$user[1]=array('id'=>2,'username'=>'螃蟹1','password'=>'ww1234w6');
$user[2]=array('id'=>3,'username'=>'螃蟹2','password'=>'ww123d56');
$user[3]=array('id'=>4,'username'=>'螃蟹3','password'=>'ww12a456');
$user[4]=array('id'=>5,'username'=>'螃蟹4','password'=>'ww1o3456');

//加载迭代器
$users = new UserIterator($user);
foreach($users as $userobj){
	$userobj->output();
}
?>



输出结果:
id:1 username:螃蟹0 password:ww123456
id:2 username:螃蟹1 password:ww1234w6
id:3 username:螃蟹2 password:ww123d56
id:4 username:螃蟹3 password:ww12a456
id:5 username:螃蟹4 password:ww1o3456



迭代器模式应用起来还是比较麻烦,但是比直接使用循环语句更为强大,而且可以避免直接暴露原对象,而且可以直接迭代对象集合。螃蟹感觉还好,有点类似之前学习数据结构时的指针实现链表操作,明天再回顾一下,好好理解就可以了


你可能感兴趣的:(设计模式,PHP,迭代器模式)