【PHP设计模式 06_GuanChaZhe.php】观察者模式
<?php
/**
* 【观察者模式】
* PHP5中提供了 观察者(observer) 和 被观察者(subject) 的接口
* 在手册搜索:SplSubject (PHP 5 >= 5.1.0)
*
* SplSubject {
* abstract public void attach ( SplObserver $observer )
* abstract public void detach ( SplObserver $observer )
* abstract public void notify ( void )
* }
*
*/
header("Content-type: text/html; charset=utf-8");
/*根据登录次数和爱好,进行观察.定义user类,实现SplSubject接口 */
class User implements SplSubject{
public $lognum; //登录次数
public $hobby; //爱好
protected $observers; //用来储存对象
public function __construct($hobby){
$this->lognum = rand(1,10); //登录次数:随机数
$this->hobby = $hobby; //爱好:参数传递
$this->observers = new SplObjectStorage();
}
//登录操作
public function login(){
//操作session... 代码忽略
//登录后,触发notify
$this->notify();
}
//观察
public function attach(SPLObserver $observer){
$this->observers->attach($observer);
}
//取消观察
public function detach(SPLObserver $observer){
$this->observers->detach($observer);
}
//通知
public function notify(){
$this->observers->rewind();
//不断循环获取储存的对象
while($this->observers->valid()){
$observer = $this->observers->current();
$observer->update($this);
$this->observers->next();
}
}
}
/*假如现在有个“安全模块” security 要来观察 */
class security implements SPLObserver{
public function update(SplSubject $subject){
if($subject->lognum < 3){
echo '这是第'.$subject->lognum.'次安全登录<br>';
}else{
echo '这是第'.$subject->lognum.'次登录,出现异常。<br>';
}
}
}
/*再假如现在有个“广告模块” ad 要来观察 */
class ad implements SPLObserver{
public function update(SplSubject $subject){
if($subject->hobby == 'sports'){
echo '开运动会<br>';
}else{
echo '哈哈哈哈哈哈<br>';
}
}
}
/*实施观察*/
//实例化User
$user = new User('sports');
//实施“安全模块”的观察
$user->attach(new security());
//实施“广告模块”的观察
$user->attach(new ad());
//执行登录操作
$user->login();
【PHP设计模式 06_GuanChaZhe.php】观察者模式的更多相关文章
- 设计模式 ( 十六 ) 观察者模式Observer(对象行为型)
设计模式 ( 十六 ) 观察者模式Observer(对象行为型) 1.概述 一些面向对象的编程方式,提供了一种构建对象间复杂网络互连的能力.当对象们连接在一起时,它们就可以相互提供服务和信息. 通常来 ...
- Java设计模式之《观察者模式》及应用场景
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6513651.html 观察者模式,又可以称之为发布-订阅模式,观察者,顾名思义,就是一个监 ...
- Java设计模式百例 - 观察者模式
观察者(Observer)模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,主体对象的状态变化会通知所有观察者对象.观察者模式又叫做发布-订阅(Publish/Subscribe ...
- [head first 设计模式]第二章 观察者模式
[head first 设计模式]第二章 观察者模式 假如我们有一个开发需求--建造一个气象观测站展示系统.需求方给我们提供了一个WeatherObject对象,能够自动获得最新的测量数据.而我们要建 ...
- Java设计模式10:观察者模式
观察者模式 观察者模式也叫作发布-订阅模式,也就是事件监听机制.观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态上发生变化时,会通知所有观察者对象,使他 ...
- 大话设计模式C++版——观察者模式
观察者模式是一种类似于消息分发的模式,用于一个任务需要被多个对象监听的场景,或者成员对象需要反向通知类对象的情况,是一种很有用的设计模式. 这里以大话设计模式中的例子为例,办公室员工A.B.C在 ...
- 【C++深入浅出】设计模式学习之观察者模式
前言 前两天学习了weak_ptr以后还是不甚明了,一则需要实际应用去锤炼,二来就是不懂观察者模式. 正文 观察者模式又叫发布-订阅模式,定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对 ...
- php设计模式之:观察者模式
转载自php面向对象设计模式 之 观察者模式 问题 假如一个小贩, 他把产品的价格提升了, 不同的消费者会对此产生不同的反应.一般的编程模式无非是获取提升的价格,然后获取所有的消费者,再循环每个消费者 ...
- 我理解设计模式C++实现观察者模式Observer Pattern
概述: 近期中国股市起起伏伏,当然了起伏就用商机,小明发现商机后果断想入市,买入了中国证券,他想在电脑client上,网页上,手机上,iPad上都能够查看到该证券的实时行情,这样的情况下我们应该怎么设 ...
随机推荐
- EBS运行快速安装的程序时,提示DISPLAY变量设置不对
EBS运行快速安装的程序时,系统提示如下: Rapid Install Wizard is validating your file system...... >> Wizard requ ...
- c# 排序算法总结
/// <summary> /// 冒泡排序法1 /// </summary> /// <param name="list"></para ...
- tcpdump note
from http://www.cnblogs.com/ggjucheng/archive/2012/01/14/2322659.html 用简单的话来定义tcpdump,就是:dump the tr ...
- J2EE sitemesh使用
maven包含sitemesh: <dependency> <groupId>opensymphony</groupId> <artifactId>si ...
- vs2003打包
怎样将.Net程序部署到没有安装.Net Framwork的机器上? 部署在.Net 平台下开发的应用程序,需要安装安装对应版本的.Net Framwork,而Vsual Studio 2003并没有 ...
- SQL2008无法连接到.\SQLEXPRESS,用户'sa'登录失败(错误18456)图文解决方法
出现问题 :标题: 连接到服务器 ------------------------------ 无法连接到 .\SQLEXPRESS. ------------------------------ ...
- 关于MVC4中EFCoderFirst 数据迁移的三句经典指令
首先输入这句指令 enable-migrations -contexttypename SchoolContext ---------(SchoolContext为你设置的数据库名)它会自动 ...
- 大数据量的csv文件如何导入到 sql 数据库
BULK INSERT dbo.T_test001 FROM 'E:\bus_20160316\bus全量评级及借款编号_20160316.csv' WITH ( FIELDTERMINATOR =' ...
- oracle的簇的管理
使用ALTER修改簇属性(必须拥有ALTER ANY CLUSTER的权限) 1.修改簇属性 可以修改的簇属性包括: * PCTFREE.PCTUSED.INITRANS.MAXTRANS.STORA ...
- po line received is canceled(恢复PO被取消的余量)
1張PO已部分收貨,後來由于某種原因,將部分收貨的PO明行取消,現在要對已收料的這一部分進行退貨處理,要怎麼做才好呢? [@more@]DATA COLLECTED===============COL ...