<?php
/**
* php观察者模式,估计现在流行的框架中的event机制应该就是用的观察者模式实现的
* 应用场景举例:
* 1、网页中根据用户选择的性别显示不同风格(裙子、西服)
* 2、根据用户登录次数及爱好做安全处理及展示广告
* observer:观察者
* subject:被观察者
* SplObserver、SplSubject是系统自带的接口
*/
class user implements SplSubject
{
public $logNum;//第几次登录
public $hobby;//爱好
protected $observers = null;
public function __construct($hobby)
{
$this->logNum = rand(1, 10);
$this->hobby = $hobby;
$this->observers = new SplObjectStorage();
}
public function login()
{
//登录逻辑略
//通知观察者,本例中是指security及ad
$this->notify();
}
/**
* 添加观察者
* @param SplObserver $observer
*/
public function attach(SplObserver $observer)
{
$this->observers->attach($observer);
}
/**
* 删除观察者
* @param SplObserver $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被观察者:user()
$this->observers->next();
}
}
}
class security implements SplObserver
{
public function update(SplSubject $subject)
{
if ($subject->logNum < 3) {
echo "这是第{$subject->logNum}次安全登录<br/>";
} else {
echo "这是第{$subject->logNum}次安全,异常<br/>";
}
}
}
class ad implements SplObserver
{
public function update(SplSubject $subject)
{
if ($subject->hobby == 'sports') {
echo "去打球<br/>";
} else {
echo "学习http://www.hu-rong.com<br/>";
}
}
}
//实施观察
$user = new user('sports');
$user->attach(new security());
$user->attach(new ad());
$user->login();
//运行结果:
这是第2次安全登录
去打球
//实施观察
$user = new user('study');
$user->attach(new security());
$user->attach(new ad());
$user->login();
//运行结果:
这是第5次安全,异常
学习http://www.hu-rong.com
- 相关文章
- php设计模式-职责链模式及应用场景
- php设计模式-策略模式及应用场景举
- php设计模式-装饰器模式及应用场景
- php设计模式-适配器模式及应用场景
- php设计模式-桥接模式及应用场景举
- php设计模式-单例模式
- php设计模式-工厂模式
- 热门文章
- win7中将文件拷贝到虚拟机linux下
- phpexcel设置行高及列宽,背景颜色,
- rabbitmq无法启动
- intellij idea不显示git push按钮
- php7中使用mongodb的aggregate进行
- centos7.4 64位下swoole安装及配置
- laravel页面静态化的方法
- navicate连接mycat报1184错误
- 单点登录sso原理及php实现方式及de
- devops-jenkins容器为pending状态
- 好评文章
- phpexcel设置行高及列宽,背景颜色,
- php7中使用mongodb的aggregate进行
- intellij idea打开文件所在文件夹
- windows下使用MongoDB Compass Com
- win7中将文件拷贝到虚拟机linux下
- laravel 中悲观锁 & 乐观锁的使用
- 单点登录sso原理及php实现方式及de
- navicate连接mycat报1184错误
- rabbitmq无法启动
- laravel整合dingo/api方法步骤:jwt
- 我的项目
- 【github】www.github.com/hurong241
- 【码云】gitee.com/hu_rong/projects
- 【docker hub】hub.docker.com/repositories/hurong241
- 【packagist】packagist.org/users/hurong241/packages
- 站点信息
- 建站时间:2011年
- 文章数:607篇
- 浏览数:941420