php设计模式之观察者模式实例代码
2024-09-06 22:31:25
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();
最新文章
- bzoj1584--DP
- 使用 Device Mapper来改变Docker容器的大小
- mysql基于init-connect+binlog完成审计功能
- linux下查看内存的命令
- Oracle 12c 安装手册
- vh属性-- 一个永远垂直居中的弹出框
- linux(Ubuntu)安装QQ2013
- Win7系统删除微软拼音
- ubuntu 下安装极点五笔
- 要将PYTHON应用于工作啦
- 安装MYSql Windows7下MySQL5.5.20免安装版的配置
- 「CODVES 1922 」骑士共存问题(二分图的最大独立集|网络流)&;dinic
- 基于Accord.Audio和百度语言识别
- Python+AutoIt实现界面工具开发
- 开源的api文档管理系统
- Virtual DOM 和 diff 算法
- java九九乘法表
- 变量为空代表false
- suoi14 子树查找 (dfs)
- Python 学习目录
热门文章
- 网络共享服务(一)之FTP
- P4883 mzf的考验[平衡树]
- openlayers显示区域
- 关于文件中";wb";与";rb";的理解
- sqlmap注入基本教程
- 数据库中的sql完整性约束
- 1级搭建类102-Oracle 11g 单实例 FS(11.2.0.4+RHEL 7)公开
- 小白的java学习之路 “ 带参数的方法”
- Python实现DBSCAN聚类算法(简单样例测试)
- PP: A multi-horizon quantile recurrent forecaster