php设计模式之观察者模式实例代码
<?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设计模式之观察者模式实例代码的更多相关文章
- js设计模式之实现观察者模式实例代码
前端界面 html代码 <body> <select name="" id="select"> <option value=&qu ...
- 设计模式入门,观察者模式,c++代码实现
// test02.cpp : Defines the entry point for the console application.////设计模式第2章 观察者模式#include " ...
- php设计模式之适配器模式实例代码
<?php header("Content-type:text/html;charset=utf-8"); // 适配器模式 /** * 查看天气接口 */ class Ti ...
- php设计模式之装饰模式实例代码
<?php header("Content-type:text/html;charset=utf-8"); /** * 文章编辑类 */ class Article { pr ...
- php设计模式之多态实例代码
<?php header("Content-type:text/html;charset=utf-8"); /** * 虎 */ abstract class Tiger { ...
- php 设计模式之观察者模式(订阅者模式)
php 设计模式之观察者模式 实例 没用设计模式的代码,这样的代码要是把最上面那部分也要符合要求加进来,就要修改代码,不符合宁增不改的原则 介绍 观察者模式定义对象的一对多依赖,这样一来,当一个对象改 ...
- Android使用的设计模式1——观察者模式
设计模式,对程序员来说是一个坎,想在程序员这条路走得更远,设计模式是你的必修课.从大学时代接触GoF到工作几年后重新看设计模式,每次感觉都不一样.这次想借着分析Android Framework源码的 ...
- 【Python】《大话设计模式》Python版代码实现
<大话设计模式>Python版代码实现 上一周把<大话设计模式>看完了,对面向对象技术有了新的理解,对于一个在C下写代码比较多.偶尔会用到一些脚本语言写脚本的人来说,很是开阔眼 ...
- [JS设计模式]:观察者模式(即发布-订阅者模式)(4)
简介 观察者模式又叫发布---订阅模式,它定义了对象间的一种一对多的关系,让多个观察者对象同时监听某一个主题对象,当一个对象发生改变时,所有依赖于它的对象都将得到通知. 举一个现实生活中的例子,例如小 ...
随机推荐
- 前向传播和反向传播实战(Tensor)
前面在mnist中使用了三个非线性层来增加模型复杂度,并通过最小化损失函数来更新参数,下面实用最底层的方式即张量进行前向传播(暂不采用层的概念). 主要注意点如下: · 进行梯度运算时,tensorf ...
- openlayers轨迹匀速播放
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- js微信禁用右上角的分享按钮,和vue中微信页面禁用右上角的分享按钮的问题
1.隐藏微信网页右上角的按钮 document.addEventListener('WeixinJSBridgeReady', function onBridgeReady() { // 通过下面这个 ...
- equals 为什么要把常量写在前面?
看例子 使用str1.equals("abc"); 如果str1是null,空是没有equals方法的,会抛出空指针异常 如果"abc".equals(str1 ...
- LayIM聊天框全屏根据浏览器高宽自适应
个人博客 地址:http://www.wenhaofan.com/article/20190410190628 问题 由于LayIM没有处理聊天框在全屏状态下根据浏览器缩放处理高宽,所以会导致在浏览器 ...
- JVM的小理解
1.开发人员编写Java代码(.java文件),然后将之编译成字节码(.class文件),再然后字节码被装入内存,一旦字节码进入虚拟机,它就会被解释器解释执行,或者是被即时代码发生器有选择的转换成机器 ...
- pandas玩转excel-> (1)如何利用pandas创建【行,列,单元格】
import pandas as pd #------新建单元格的方法一:通过先创建字典的形式 #可以先新建一个字典d={'x':100,'y':200,'z':300} #打印字典的索引print( ...
- js监听textarea 内容的变化,并计算内容的长度c
html代码如下: <div class="customer-message"> <label for="customerMessage&quo ...
- 求a^b的约数对mod取模
+; int prime[maxn]; void marktable(int n){ memset(prime,,sizeof(prime)); ;i<=n;i++){ ]]=i; ;j< ...
- Excel数据源增加时,渗透表如何刷新?
使用Excel制作渗透表的时候在选择数据源范围的时候不要选择有限区域!!!最好圈定列范围 问题:制作渗透表是,在选择数据区域时使用[Ctrl + A]或者选定有限的数据区域,从而导致当数据源增加时,渗 ...