PHP面向对象之观察者模式

    观察者模式按我的的理解,主要分为观察者类和被被观察者类二个部分。被观察者类会继承一个接口(如:Observable)实现对观察者的添加、删除和通知(即通知观察者发生了特定事件),它聚合了观察者类具体看原书类图。而观察者类继承一个接口(如:Observer)实现一个抽象方法update(),以下代码示例中此方法还将接收一个参数即被观察者,根据被观察者的状态来决定是否执行自身的业务逻辑。好了闲话不多说直接上代码。

//被观察者类
interface Observable {
    function attach(Observer $observer);    //添加观察者
    function detach(Observer $observer);    //删除观察者
    function notify();              //通知观察者
}

//一个处理登陆信息的类
class Login implements Observable{
    const LOGIN_USER_UNKNOWN =1;
    const LOGIN_WRONG_PASS =2;
    const LOGIN_ACCESS =3;
    private $status = array();  //观察者的状态
    
    private $observers;  //保存观察者对象
    
    function __construct (){
        $this->observers = array();
    }
    
    function attach(Observer $observer){
        $this->observers[] = $observer;
    }
    
    function detach(Observer $observer){
        $newobservers = array();
        foreach(|$this->observers as $obs){
            if($obs !== $observer){
                $newobservers[]=$obs;
            }
        }
        $this->observers = $newobservers;
    }
    
    function notify(){
        foreach($this->observers as $obs){
            $obs->update($this);
        }
    }
    
    function handleLogin($user,$pass,$ip){
        switch(rand(1,3)){                  //这里模拟了3种登陆状态
            case 1:
                $this->setStatus(self::LOGIN_ACCESS,$user,$ip);  //设置被观察者的状态,通知观察者后,观察者将跟据状态来执行相应的业务逻辑
                $ret =true;
                break;
            case 2:
                $this->setStatus(self::LOGIN_WRONG_PASS,$user,$ip);
                $ret =false;
                break;
            case 3:
                $this->setStatus(self::LOGIN_USER_UNKNOWN,$user,$ip);
                $ret =false;
                break;
        }        
        $this->notify():
        return $ret;
        //...............
    }
    
    private function setStatus($status,$user,$ip){
        $this->status = array($status,$user,$ip)
    }
}

//观察者类
interface Observer{
    function update(Observable $observable);
}

//这个类主要是为了确保传递过来的被观察者对象是login类,因为只有login才有setStatus方法,上面的Observer为了保证它的通用性所以没有加入抽象方法setStatus
abstract class LoginObserver implements Observer{  
    private $login;
    function __construct (Login $login){
        $this->login=$login;
        $login->attach($this);
    }
    function update(Observable $observable){
        if($observable === $this->login){
            $this->doUpdate($observable);
        }
    }
    
    abstract function doUpdate(Login $login);
}

class SecurityMonitor extends LoginObserver{  //登陆时密码错误的话就发邮件给管理者
    function doUpdate(Login $login){
        $status = $login->getStatus();
        if($status[0] == Login::LOGIN_WRONG_PASS){
            //发送邮件
        }
    }
}

class GeneralLogger extends LoginObserver{    //..........
    function doUpdate(Login $login){
        $status = $login->getStatus();    
        //记录登陆数据
    }
}

class partnershipTool extends LoginObserver{      //.........
    function doUpdate(Login $login){
        $status = $login->getStatus();    
        //检查iP,设置Cookie    
    }
}

最后: 路漫漫其修远兮,吾将上下而求索!

时间: 2025-01-02 19:09:19

PHP面向对象之观察者模式的相关文章

Js面向对象之观察者模式

//模拟一个目标可能拥有的一些列依赖 function ObserverList() { this.observerList = []; }; //添加一个观察者 ObserverList.prototype.Add = function (obj) { return this.observerList.push(obj); }; //清除所有观察者 ObserverList.prototype.Empty = function () { this.observerList = []; }; /

关于我,至目前的总结与展望(2015年2月28日)

某普通一本,信息与计算科学专业,大四..快毕业了,而我才对自己的有一个比较完整认知,很多本应在大学掌握的东西,只能从现在,并将占用毕业前一两年的的时间去弥补,不过我毕竟还年轻,大学毕业也只是开始,还有时间,这是不幸,也是我的幸运.就总结下自己大学的这四年,并做一下未来的规划吧. 一,大三上学期11月之前 这段的知识几乎空白,看小说玩游戏中浪费不少,唯一有用的就是大二的暑假读完一整本<c++ primer>,对编程有那么点感觉,自认为这是学的最好的,也是唯一的一门课程.也从帮助同学调试代码中获得

javascript面向对象--观察者模式(为对象添加事件监听功能)

正文开始之前,有这么一个需求: >背景:宁静的夜晚,一天晚上,狗蛋(主人)睡得正香,侠盗高飞(小偷)突然造访. >事件:高飞正准备下手的时候,不料被旺财(狗)发现了,于是旺财叫了起来,狗蛋醒了,高飞逃走了. 分析需求后,可以发现有三个对象: 高飞(小偷) 旺财(狗) 狗蛋(主人) 创建对象的构造函数以及原型方法 //人的构造函数 function Person(name){ this.name=name; //首次创建实例时,为Person的原型添加共有的方法 if(!Person.proto

面向对象程序设计(OOP设计模式)-行为型模式之观察者模式的应用与实现

课程名称:程序设计方法学 实验5:OOP设计模式-行为型模式的应用与实现 时间:2015年12月02日三,第3.4节地点:理1 一.实验目的 加深对行为型设计模式的理解以及在开发中的实际应用能力. 二.实验内容 实验内容: 在工业自动化系统中,作为监控端,要求能够实时采集生产线上每一个测点的数据,并根据事先设定好的条件来发出告警.目前,系统可以支持的告警方式在形式上呈现多样化的趋势,主要包括屏幕显示告警.语音发声告警.电话拨号告警.电子邮件告警.手机短信告警以及其他可利用的告警方式等.在设置监控

C#面向对象设计之——观察者模式(十七)

一.前言 观察者模式也叫发布-订阅模式.观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听一个主题对象,这个主题对象状态发生状态变化时,会通知所有的观察者对象,使它们能够自动更新自己. 什么时候使用观察者模式?当一个对象的改变需要同时改变其他对象的时候. 二.结构图 三.实例代码 using System; using System.Collections.Generic; using System.Text; namespace 观察者模式 { class Program { st

面向对象的设计模式(七),观察者模式

似乎全部的设计模式都是为了使得程序具有低耦合,灵活性高,可扩展性好.程序结构清晰等等. 今天的这个设计模式-观察者模式自然也不例外.但程序结构清晰可能就不是重点了. 好吧,废话少说,模式这样的简单粗暴的东西还是要快点学习.以下直接进入正题. 定义:观察者模式是让对象与对象之前建立一种一对多(不是Bean之前的一对多)的关系,这样的关系使得当一的一方的状态改变时,全部多的一方自己主动依据一的一方的改变做出对应的改变. 使用场景: 事件多级触发.如一个公司,CEO是最顶层的被观察者(一的一方),观察

设计模式之观察者模式

观察者模式又称发布-订阅模式,是一种行为型模式.在此种模式中,一个目标物件管理所有相依于它的观察者物件, 并且在它本身的状态改变时主动发出通知.这种模式通常用来实现事件处理系统. 观察者模式完美的将观察者和被观察的对象分离开,在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性. 观察者模式定义了对象间的一种一对多的依赖关系,以便一个对象状态发生变化时,所有依赖于它的对象都得到通知并自动刷新. 实现方式: 观察者模式有很多实现方式,从根本上说,该模式必须包含两个角色:观察者和被观察对象.

用java观察者模式解耦经典三层架构

三层架构是一个很经典的架构模式,依据系统的职责不同.将系统分成了表现层,逻辑层和数据訪问层,而且配合数据实体进行传输数据,能够大大的封装性和复用性. 经典的三层架构图: 我们再深入到架构图内部.看看详细的类图,用简单的登陆举例吧: 这里通过LoginUI.调用了LoginLogService和LoginVerificationService两个类.通过类图能够看得出,U层和Service层(本文把BLL层称为了Service层)直接採用了直接调用的方式. 在面向对象的设计中.一直强调要面向接口编

[GeekBand] 设计模式之观察者模式学习笔记

本文参考文献::GeekBand课堂内容,授课老师:李建忠 :网络资料: http://blog.csdn.net/hguisu/article/details/7556625 本文仅作为自己的学习笔记,不代表权威,因为是初学,有错误烦请大家指正,谢谢. 1.什么是观察者模式,应用场所有哪些? 观察者模式(有时又被称为发布-订阅Subscribe>模式.模型-视图View>模式.源-收听者Listener>模式或从属者模式)是软件设计模式的一种.在此种模式中,一个目标物件管理所有相依于它