观察者模式
观察者模式(有时又被称为发布-订阅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(); } } }
<?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); }
原文地址:http://blog.csdn.net/fb408487792/article/details/46574355