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();

php设计模式之观察者模式实例代码的更多相关文章

  1. js设计模式之实现观察者模式实例代码

    前端界面 html代码 <body> <select name="" id="select"> <option value=&qu ...

  2. 设计模式入门,观察者模式,c++代码实现

    // test02.cpp : Defines the entry point for the console application.////设计模式第2章 观察者模式#include " ...

  3. php设计模式之适配器模式实例代码

    <?php header("Content-type:text/html;charset=utf-8"); // 适配器模式 /** * 查看天气接口 */ class Ti ...

  4. php设计模式之装饰模式实例代码

    <?php header("Content-type:text/html;charset=utf-8"); /** * 文章编辑类 */ class Article { pr ...

  5. php设计模式之多态实例代码

    <?php header("Content-type:text/html;charset=utf-8"); /** * 虎 */ abstract class Tiger { ...

  6. php 设计模式之观察者模式(订阅者模式)

    php 设计模式之观察者模式 实例 没用设计模式的代码,这样的代码要是把最上面那部分也要符合要求加进来,就要修改代码,不符合宁增不改的原则 介绍 观察者模式定义对象的一对多依赖,这样一来,当一个对象改 ...

  7. Android使用的设计模式1——观察者模式

    设计模式,对程序员来说是一个坎,想在程序员这条路走得更远,设计模式是你的必修课.从大学时代接触GoF到工作几年后重新看设计模式,每次感觉都不一样.这次想借着分析Android Framework源码的 ...

  8. 【Python】《大话设计模式》Python版代码实现

    <大话设计模式>Python版代码实现 上一周把<大话设计模式>看完了,对面向对象技术有了新的理解,对于一个在C下写代码比较多.偶尔会用到一些脚本语言写脚本的人来说,很是开阔眼 ...

  9. [JS设计模式]:观察者模式(即发布-订阅者模式)(4)

    简介 观察者模式又叫发布---订阅模式,它定义了对象间的一种一对多的关系,让多个观察者对象同时监听某一个主题对象,当一个对象发生改变时,所有依赖于它的对象都将得到通知. 举一个现实生活中的例子,例如小 ...

随机推荐

  1. tensorflow张量排序

    本篇记录一下TensorFlow中张量的排序方法 tf.sort和tf.argsort # 声明tensor a是由1到5打乱顺序组成的 a = tf.random.shuffle(tf.range( ...

  2. Spark学习之路 (七)Spark 运行流程[转]

    Spark中的基本概念 (1)Application:表示你的应用程序 (2)Driver:表示main()函数,创建SparkContext.由SparkContext负责与ClusterManag ...

  3. 【Unity|C#】基础篇(1)——基础入门

    [学习资料] <C#图解教程>(第2~12章):https://www.cnblogs.com/moonache/p/7687551.html 电子书下载:https://pan.baid ...

  4. Python原来这么好学-1.3节: 知识要点总结与内容复习

      这是一本教同学们彻底学通Python的高质量学习教程,认真地学习每一章节的内容,每天只需学好一节,帮助你成为一名卓越的Python程序员: 本教程面向的是零编程基础的同学,非科班人士,以及有一定编 ...

  5. Spark学习之路 (一)Spark初识 [转]

    官网介绍 什么是Spark 官网地址:http://spark.apache.org/ Apache Spark™是用于大规模数据处理的统一分析引擎. 从右侧最后一条新闻看,Spark也用于AI人工智 ...

  6. yum装包报错

    [root@iZ6wefn2kl6064uuaxuwetZ ~]# yum –y install  gcc  pcre-devel zlib-devel openssl-develLoaded plu ...

  7. unrecognized import path "golang.org/x/*"的解决办法

    由于国内网络原因,因此访问https://golang.org/网站会被限制.所以在go get下载其他第三方包的时候,如果这个第三方包又引用了https://golang.org/x/下的包,通常会 ...

  8. LaTeX技巧003:实现一个章标题

    代码如下: \documentclass[11pt]{book} \usepackage{graphicx} \usepackage{CJKfntef} \usepackage{color} \mak ...

  9. jenkins Exec exit status not zero. Status [-1]

    jenkins是使用ssh连接服务器后,如果使用grep获取进程并kill时,会jenkins Exec exit status not zero. Status [-1],解决办法:在获取进程时,使 ...

  10. 清理 /dev/vda1 系统磁盘

    df-h检查一台服务器磁盘使用空间,发现磁盘已经使用了100% 思路是: 1.cd /usr 2.du -sh * 看哪个目录占用空间大 3.重复前两步,根据实际情况删除或者移走 4.日志的话可以运行 ...