码迷,mamicode.com
首页 > Web开发 > 详细

php设计模式 四 (观察者 原型模式 迭代器模式)

时间:2015-06-21 09:32:46      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:设计模式   php   观察者   原型模式   迭代器模式   

观察者模式

观察者模式(有时又被称为发布-订阅Subscribe>模式、模型-视图View>模式、源-收听者Listener>模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。
当一个对象的状态发生改变时,依赖他的对象全部会接到通知,并自动更新。观察者模式实现了低耦合 非入侵式的通知与更新机制。

观察者模式示例:
首先创建一个事件生成器 EventGenerator.php

<?php

namespace Components\ObServer;

abstract class EventGenerator {
	
	private $obServers = array();
	function addObServer(IObServer $obServer) {//添加事件
		$this->obServers[] = $obServer;
	}
	
	function notify() {
		foreach ($this->obServers as $obServer) {//一一执行更新
			$obServer->update();
		}
	}
}

创建一个观察者接口IObServer.php
<?php

namespace Components\ObServer;

interface IObServer {
	function update($event_info = NULL);
}

事件主体:
class Event extends \Components\ObServer\EventGenerator{
	function tringger() {
		echo "<br>Event<br/>";
		$this->notify();
	}
}

观察者:
//观察者1
class ObServer1 implements \Components\ObServer\IObServer {
	function update($event_info = null) {
		echo "logic1<br>";
	}
}

//观察者2
class ObServer2 implements \Components\ObServer\IObServer {
	function update($event_info = null) {
		echo "logic2<br>";
	}
}

触发:
$event = new Event();
$event->addObServer(new ObServer1());
$event->addObServer(new ObServer2());
$event->tringger();



原型模式

与工厂模式类似,用于创建对象,不同的是原型模式先创建好一个原型对象,通过clone原型对象来创建新的对象,如此就避免了类创建时的重复的初始化操作,一般用于大对象的创建,免去了每次new的重复消耗,而只是内存拷贝。
它主要面对的问题是:“某些结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是他们却拥有比较稳定一致的接口。

示例代码:

/* 原型模式 */
class BigClass {
	function init() {
		;
	}
	
	function exec($tpye) {
		echo "prototype$tpye<br>";
	}	
}
/**
 * 原型用户大对象的创建 节约资源
 */
$prototype = new BigClass();
$prototype->init();

$bigClass1 = clone $prototype;
$bigClass2 = clone $prototype;

$bigClass1->exec(1);
$bigClass2->exec(2);


迭代器模式

在不需要了解内部实现的情况下,遍历一个聚合对象的内部元素。相比传统编程模式,迭代器模式可以隐藏遍历元素所需操作

迭代器示例UserIterator.php

<?php

namespace Components\Iterator;

use Components\Register;
use Components\Factory;

class UserIterator implements \Iterator {
	
	protected $ids;
	protected $data = array();
	protected $index;
	
	function __construct() {
		$db = Register::get('slave');
		$result = $db->query('select id from users');
		$this->ids = $result->fetch_all(MYSQL_ASSOC);
	}
	
	//1
	function rewind(){
		$this->index = 0;
	}
	
	//2
	function valid(){
		return $this->index < count($this->ids);
	}
	
	//3
	function current() {
		return Factory::getUser($this->ids[$this->index]['id']);
	}
	
	//4
	function next() {
		++$this->index;
	}
	
	//5
	function key() {
		return $this->index;
	}
	
}

使用:
/* 迭代器模式 */
$users = new UserIterator();
foreach ($users as $user) {
	var_dump($user);
}


php设计模式 四 (观察者 原型模式 迭代器模式)

标签:设计模式   php   观察者   原型模式   迭代器模式   

原文地址:http://blog.csdn.net/fb408487792/article/details/46574355

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!