php提供的两个接口,一个被观察者接口SplSubject,一个或多个观察者接口SPLObserver,和一个可以储存对象的类SplObjectStorage。被观察者有三个方法,需要实现这三个方法,一个attach可以理解为添加一个观察者,detach可以理解为删除掉一个观察者,一个notify里面做循环执行被观察者的update方法(被观察者被存储在SplObjectStorage类里面),update方法把本类作为参数传进去。
 
<?php
header("Content-type:text/html;charset=utf-8"); /**
*
*/
class Login implements SplSubject
{
public $hobby;
public $loginTimes;
protected $observers = null; function __construct($hobby)
{
$this->hobby = $hobby;
$this->loginTimes = rand(,);
$this->observers = new SplObjectStorage();
} public function login()
{
// login业务逻辑编写 $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();//将指针往下走一位
// }
foreach ($this->observers as $value) {
$value->update($this);
}
}
} //用户推送-观察者
class PushUser implements SplObserver
{
public function update(SplSubject $subject)//传进来一个被观察者
{
//写自己的业务逻辑
if ($subject->hobby == 'sport') {
echo "推送运动产品<br>";
}else{
echo "推送热门产品<br>";
}
}
} //安全信息推送-观察者
class PushSecurity implements SplObserver
{
public function update(SplSubject $subject)//传进来一个被观察者
{
//写自己的业务逻辑
if ($subject->loginTimes < ) {
echo "你今天第".$subject->loginTimes."次安全登录<br>";
}else{
echo "你今天第".$subject->loginTimes."次安全登录,出现异常登录<br>";
}
}
} //新闻推送-观察者
class PushNews implements SplObserver
{
public function update(SplSubject $subject)
{
//写自己的业务逻辑
if ($subject->hobby == 'sport') {
echo "推送运动新闻<br>";
}else{
echo "推送热门新闻<br>";
}
}
} $user= new Login('sport');//创建一个实现了被观察者的接口类
$user->attach(new PushNews());//传进去一个实现了观察者的接口类
$user->attach(new PushUser());
$user->attach(new PushSecurity());
$user->login();

最新文章

  1. bzoj1584--DP
  2. 使用 Device Mapper来改变Docker容器的大小
  3. mysql基于init-connect+binlog完成审计功能
  4. linux下查看内存的命令
  5. Oracle 12c 安装手册
  6. vh属性-- 一个永远垂直居中的弹出框
  7. linux(Ubuntu)安装QQ2013
  8. Win7系统删除微软拼音
  9. ubuntu 下安装极点五笔
  10. 要将PYTHON应用于工作啦
  11. 安装MYSql Windows7下MySQL5.5.20免安装版的配置
  12. 「CODVES 1922 」骑士共存问题(二分图的最大独立集|网络流)&amp;dinic
  13. 基于Accord.Audio和百度语言识别
  14. Python+AutoIt实现界面工具开发
  15. 开源的api文档管理系统
  16. Virtual DOM 和 diff 算法
  17. java九九乘法表
  18. 变量为空代表false
  19. suoi14 子树查找 (dfs)
  20. Python 学习目录

热门文章

  1. 网络共享服务(一)之FTP
  2. P4883 mzf的考验[平衡树]
  3. openlayers显示区域
  4. 关于文件中&quot;wb&quot;与&quot;rb&quot;的理解
  5. sqlmap注入基本教程
  6. 数据库中的sql完整性约束
  7. 1级搭建类102-Oracle 11g 单实例 FS(11.2.0.4+RHEL 7)公开
  8. 小白的java学习之路 “ 带参数的方法”
  9. Python实现DBSCAN聚类算法(简单样例测试)
  10. PP: A multi-horizon quantile recurrent forecaster