例如在登录时,需要判断用户是第几次登录,登录过于频繁我们就给用户提示异常。根据用户的爱好,在用户登录后给予相应的猜你喜欢。如果都在 登录时判断密码的方法内完成,不符合面向对对象的单一职责。那我们该怎么完成呢?

    php 在 5.1 之后有自带的 --> 观察者 observer 和 被观察者 subject 接口。

    观察者模式分为观察者、与被观察者。观察者时刻监听被观察动态,及时做出相应改变。

直接上代码:

<?php
    header("content-type:text/html;charset=utf8");
    //实现被观察者接口。
    class usr implements SplSubject{
        public $lognum;
        public $hobby;
        protected $observers=null;

        public function login(){
            //检测操作
            //session 操作
            $this->notify();
        }    

        public function __construct($hobby){
            $this->lognum=rand(1,12);
            $this->hobby=$hobby;
            $this->observers=new SplObjectStorage();
        }
        //添加观察者对象。
        public function attach(SPLObserver $observer){
            $this->observers->attach($observer);
        }
        //删除观察者对象。
        public function detach(SPLObserver $observer){
            $this->observers->detach($observer);
        }
        //触发观察者的改变事件。
        public function notify(){
            //重置观察者队列。
            $this->observers->rewind();
            //将观察者从队列一个一个取出。
            //valid 是检测是否还存在观察者。
            while($this->observers->valid()){
                //取出当前观察者。
                $observer=$this->observers->current();
                //触发观察者改变事件(将被观察者对象传递过去)。
                $observer->update($this);
                //将队列指针移动向下一位。
                $this->observers->next();
            }
        }
    }
    //观察者判断被观察者改变。
    class Login implements SPLObserver{
        public function update(SplSubject $subject){
            //判断所观察属性的改变。
            if($subject->lognum < 3){
                echo '这是第'.$subject->lognum."次安全登陆。"."<br>";
            }else{
                echo '这是第'.$subject->lognum."次登陆,异常"."<br>";
            }
        }
    }
    //观察者判断被观察者改变。
    class Hobby implements SplObserver{
        public function update(SplSubject $subject){
            //判断所观察属性的改变。
            if($subject->hobby=="sports"){
                echo '健身是身体健康的最佳捷径。';
            }else{
                echo"热爱生活!!!";
            }
        }
     }

    //实施观察。
    $use= new usr("sports");
    $use->attach(new Login());
    $use->attach(new Hobby());
    $use->login();
?>

php八大设计模式之观察者模式的更多相关文章

  1. 乐在其中设计模式(C#) - 观察者模式(Observer Pattern)

    原文:乐在其中设计模式(C#) - 观察者模式(Observer Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 观察者模式(Observer Pattern) 作者:weba ...

  2. 设计模式之观察者模式(Observable与Observer)

    设计模式之观察者模式(Observable与Observer) 好久没有写博客啦,之前看完了<设计模式之禅>也没有总结一下,现在回忆一下设计模式之观察者模式. 1.什么是观察者模式 简单情 ...

  3. 8.5 GOF设计模式四: 观察者模式Observer

    GOF设计模式四: 观察者模式Observer  现实中遇到的问题  当有许多不同的客户都对同一数据源感兴趣,对相同的数据有不同的处理方式,该如 何解决?5.1 定义: 观察者模式  观察者模式 ...

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

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

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

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

  6. 实践GoF的23种设计模式:观察者模式

    摘要:当你需要监听某个状态的变更,且在状态变更时通知到监听者,用观察者模式吧. 本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:观察者模式>,作者: 元闰子 . 简介 现在有 ...

  7. java设计模式之观察者模式

    观察者模式 观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式.模型-视图(View)模式.源-收听者(Listener)模式或从属者模式)是软件设计模式的一种.在此种模 ...

  8. [python实现设计模式]-4.观察者模式-吃食啦!

    观察者模式是一个非常重要的设计模式. 我们先从一个故事引入. 工作日的每天5点左右,大燕同学都会给大家订饭. 然后7点左右,饭来了. 于是燕哥大吼一声,“饭来啦!”,5点钟定过饭的同学就会纷纷涌入餐厅 ...

  9. 【GOF23设计模式】观察者模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_观察者模式.广播机制.消息订阅.网络游戏对战原理 package com.test.observer; import ja ...

随机推荐

  1. 寻找两个有序数组的中位数 C++实现leetcode系列(四)

    给定两个大小为 m 和 n 的有序数组 nums1和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2 不 ...

  2. MyEclipse 启动之 java.lang.RuntimeException: No application id has been

    found. 今天公司刚买来一台服务器,配置安装 java 开发环境的时候,MyEclipse 无法启动,查看日志文件之后,具体错误信息 如下: [java] view plaincopyprint? ...

  3. 【原创】Google的文本内容对比代码

    /* * Diff Match and Patch * * Copyright 2006 Google Inc. * http://code.google.com/p/google-diff-matc ...

  4. Jlink如何校验Hex

    打开SEGGER J-Flash ARM,记住必须设置好工程属性后才能校验,否则校验和为0 设置好工程属性后,直接将Hex拖入到工程中即可.在LOG窗口中会显示CRC的值 如何校验芯片中的程序的版本号 ...

  5. HDU 1587 Flowers【贪心】

    题意:给出n种花的价钱,和总的金额m,问最多能够买到多少朵花.先排序,然后就是便宜的花在能够买的范围内能够多买就多买 #include<iostream> #include<cstd ...

  6. javascript 异或运算符实现简单的密码加密功能

    写在前面的 当我们需要在数据库中存储用户的密码时,当然是不能明文存储的. 我们就是介绍一下用^运算符来实现简单的密码加密以及解密功能 上代码 首先,回顾一下基础知识. String.fromCharc ...

  7. 关于Scrapy爬虫项目运行和调试的小技巧(下篇)

    前几天给大家分享了关于Scrapy爬虫项目运行和调试的小技巧上篇,没来得及上车的小伙伴可以戳超链接看一下.今天小编继续沿着上篇的思路往下延伸,给大家分享更为实用的Scrapy项目调试技巧. 三.设置网 ...

  8. Vue-cli 3.0 构建项目

    Vue-cli是vue的一个脚手架,我们可以通过它来构建我们的前端项目 vue-cli3环境配置 //1. 安装nodeJS(已经集成npm) 首先需要安装node环境,可以直接到中文官网http:/ ...

  9. ArrayList的使用方法

    1.什么是ArrayList    ArrayList就是传说中的动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了如下一些好处: 动态的增加和减少元素 实现了ICollection和I ...

  10. BZOJ1567 [JSOI2008]Blue Mary的战役地图(二分+二维hash)

    题意 问边长为n的两个正方形中最大的相等子正方形.(n<=50) 题解 用到了二维hash,感觉和一维的不太一样. 对于列行有两个不同的进制数然后也是通过类似前缀和的方法差分出一个矩形的hash ...