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

    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. Mysql实战45讲 04讲深入浅出索引(上)读书笔记 极客时间

    极客时间 Mysql实战45讲 04讲深入浅出索引 极客时间(上)读书笔记  笔记体悟 1.索引的作用:提高数据查询效率2.常见索引模型:哈希表.有序数组.搜索树3.哈希表:键 - 值(key - v ...

  2. Glide中的回调:targets

    Glide隐藏了一大推复杂的在后台的场景,Glide做了所有的网络请求和处理在后台线程中,准备好了切回到ui线程后更新ImageView. 假设ImageView不再是图像的最后一步.我们只要Bitm ...

  3. swift语言点评十一-Methods

    Assigning to self Within a Mutating Method Mutating methods can assign an entirely new instance to t ...

  4. Reactive programming-文章解析

    数据源(信息源):静态的数组.动态的流: In computing, reactive programming is a declarative programming paradigm concer ...

  5. 路飞学城Python-Day10

    [37.函数-命名空间]命名空间又称为name space,顾名思义就是存放名字的地方,存什么名字呢?举例说明,若变量 x = 1,存放于内存中,那名字x存放在哪里呢?名称空间正式存放名字x和1绑定关 ...

  6. Quartz任务调度 服务日志+log4net打印日志+制作windows服务

    引言 现在许多的项目都需要定时的服务进行支撑,而我们经常用到的定时服务就是Quartz任务调度了.不过我们在使用定时Job进行获取的时候,有时候我们就需要记录一下自定义的日志,甚至我们还会对执行定时J ...

  7. Python2.* object类............

    class object: """ The most base type """ def __delattr__(self, name): ...

  8. 抓取豆瓣的电影排行榜TOP100

    #!/usr/bin/env python # -*- coding:utf-8 -*- """ 一个简单的Python爬虫, 用于抓取豆瓣电影Top前100的电影的名称 ...

  9. LINUX 中 python 版本升级

    首先下载源tar包 可利用linux自带下载工具wget下载,如下所示: 1 # wget http://www.python.org/ftp/python/2.7.3/Python-2.7.3.tg ...

  10. C++模板遇到iterator时候遇到的问题和解决方法

    今天开发的时候,发现用模板的时候,再加上iterator,会报错,如下: std::map<T, S>::iterator find_iter = mp.find(key); 编译会报错: ...