`
xieye
  • 浏览: 830975 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

php设计模式(1)-- 观察者模式 -- spl标准写法

    博客分类:
  • PHP
阅读更多
我的设计模式系列文章
php设计模式(1)-- 观察者模式 -- spl标准写法
php设计模式(2)-- 观察者模式 -- 用trait来改进的写法
php设计模式(3)-- 责任链(职责链)模式
php设计模式(4)-- 装饰器模式


本文讲观察者模式。
部分代码来源:
https://www.ibm.com/developerworks/cn/opensource/os-cn-observerspl/

概述

个人的心得体会:最重要的一点,目标对象,给观察者对象发通知时,不需要对方的返回值,仅仅把通知下发就完事。
这是最重要的。如果需要返回,不应该用这个设计模式。

php内建了SplSubject 和 SplObserver 接口以及一个方便的SplObjectStorage类。
SplSubject 接口 需要实现3个方法:
abstract public void attach ( SplObserver $observer ) 添加(注册)一个观察者
abstract public void detach ( SplObserver $observer ) 删除一个观察者
abstract public void notify ( void ) 当状态发生改变时,通知所有观察者

SplObserver接口需要实现一个方法
abstract public void update ( SplSubject $subject ) 在目标发生改变时接收目标发送的通知;当关注的目标调用其 notify()时被调用

分析

下面构造一个需求,用户修改密码后,对其发送两种通知,一个是email通知,一个是手机短信通知。
分析需求,
1、不需要通知的返回值。
2、当目标发生状态变化时(密码修改),有多个后续处理,这时特别适合观察者。
3、监听器和目标的功能是比较分离的,不是紧密关联的。一个是发通知,一个是改数据库,这样可以借助设计模式来分解业务逻辑。
4、一般,添加监听器的代码,放在客户端代码里写

代码实现

总共4个文件,
User.php, 目标对象
MobileSender.php,某个监听器对象
EmailSender.php,某个监听器对象
Client.php,客户端代码,
在这个设计模式中,客户端代码还有添加监听器。

User.php
<?php

class User implements SplSubject {

    private $email;
    private $username;
    private $mobile;
    private $password;
    /**
     * @var SplObjectStorage
     */
    private $observers = NULL;

    public function __construct($email, $username, $mobile, $password) {
        $this->email = $email;
        $this->username = $username;
        $this->mobile = $mobile;
        $this->password = $password;

        $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() {
        
        foreach ($this->observers as $observer) {
            $observer->update($this);
        }
    }

    // 这是业务逻辑
    public function changePassword($newPassword) {
        echo __METHOD__, PHP_EOL;
        $this->password = $newPassword;
        $this->notify();
    }

    // 专门给监听器的信息,也可以省略,然后对每个字段添加get方法
    public function get_observer_info(){
        return [
            "email" => $this->email,
            "mobile" => $this->mobile,
            "username" => $this->username,
            "password" =>$this->password,
        ];
    }
}


MobileSender.php
<?php
class MobileSender implements SplObserver { 
 
   public function update(SplSubject $subject) { 
       
           $userInfo =  $subject->get_observer_info();
           // 真正的发送短信代码略。
           echo "向 手机{$userInfo['mobile']} 发送短信成功。短信内容是:你好 {$userInfo['username']}" . 
           "你的新密码是 {$userInfo['password']},请妥善保管", PHP_EOL; 
        
   } 
}


EmailSender.php
<?php
class EmailSender implements SplObserver { 
 
   public function update(SplSubject $subject) { 
       
           $userInfo =  $subject->get_observer_info();
           // 真正的发送邮件代码略。
           echo "向 {$userInfo['email']} 发送电子邮件成功。内容是:你好 {$userInfo['username']}" . 
           "你的新密码是 {$userInfo['password']},请妥善保管", PHP_EOL; 
        
   } 
}


Client.php:
<?php
header('Content-Type: text/plain');

function __autoload($class_name) {
    require_once "$class_name.php";
}

//定义目标对象
$user = new User('user1@domain.com', '张三', '13610002000', '123456');

// 添加监听器在客户端,
$email_sender = new EmailSender();
$mobile_sender = new MobileSender();
$user->attach($email_sender);
$user->attach($mobile_sender);

// 然后在对目标执行动作,顺序必须是先添加监听器,然后对象操作。
$user->changePassword('654321');




效果展示


在命令行,输入php Client.php,展示如下:
User::changePassword
向 user1@domain.com 发送电子邮件成功。内容是:你好 张三你的新密码是 654321,请妥善保管
向 手机13610002000 发送短信成功。短信内容是:你好 张三你的新密码是 654321,请妥善保管
0
0
分享到:
评论

相关推荐

    php SPL观察者模式例子

    PHP SPL(Standard PHP Library)库包含了对多种设计模式的实现,其中包括观察者模式。观察者模式是一种行为设计模式,允许一个对象,称为观察者,监视另一个对象,即主题,以便当主题的状态改变时,观察者可以自动...

    u-boot-sunxi-with-spl-vga.bin

    u-boot-sunxi-with-spl-vga

    Linux_SPL-PUB_开发指南1

    《Linux SPL-PUB 开发指南1》是一份详细介绍如何在Linux环境下进行SPL-PUB(Secondary Program Loader - Public)开发的文档。SPL-PUB是嵌入式系统启动过程中的关键部分,它负责加载主引导加载器,为系统的初始化...

    超微X11SPL-F主板用户手册

    ### 超微X11SPL-F主板用户手册知识点详解 #### 一、前言与免责声明 在深入了解超微X11SPL-F主板的各项功能之前,首先需要明确手册中的前言部分提及的重要信息: - **免责声明**:制造商虽然尽力确保手册中信息的...

    ms-bcs-spl-1.2-2.tar.gz_BCS_MS BCS SPL_MS-BCS_MS-BCS-SPL_spl

    MS-BCS-SPL一种新的压缩感知重构算法,相比TVAL3要好的多

    PHP高级程序设计-模式-框架-测试

    抽象类、接口、契约式编程开始讲起,然后介绍了静态方法、单例模式、工厂模式和PHP 6 的新特性等内容,接着介绍了测试和文档方面的内容,还介绍了标准PHP 库SPL 方面的知识以及PHP 开发人员最有可能用到的MVC 模式,...

    超微 X12SPL-LN4F主板用户手册

    ### 超微 X12SPL-LN4F 主板用户手册知识点解析 #### 一、产品概述 **超微 X12SPL-LN4F** 是一款由 Super Micro Computer, Inc. (以下简称“Supermicro”)设计并制造的高性能服务器主板。此主板面向专业级应用市场...

    SPL06-001代码

    深入研究"SPL06-001 demo code",开发者不仅可以学习到如何操作SPL06-001硬件,还可以了解到无人机控制软件的设计原则和最佳实践。这将为那些希望构建或改进自己的无人机项目的人提供宝贵的资源。

    气压传感器SPL06-001.pdf

    从这些知识点可以看出,SPL06-001气压传感器是一款功能丰富、特化设计的传感器,其设计目的是为了满足在无人机等行业应用中对高精度气压测量的需求。正确理解和应用文档中的每一个知识点,有助于最大限度地发挥该...

    ms-bcs-spl-1.2-2.rar_BCS-SPL_compressIve sensing_image compressi

    这个压缩包中的MATLAB代码,可以帮助用户了解BCS-SPL的工作原理,通过调整不同的参数,观察其对图像压缩质量和速率的影响。同时,对于想要进一步研究和改进压缩感知算法的研究者来说,这是一个很好的起点。 标签中...

    SCSI Architecture Model - 5 (SAM-5) & SPL-5

    SCSI(Small Computer System Interface)架构模型5(SAM-5)和SAS协议层5(SPL-5)是现代存储系统中两个至关重要的规范,它们定义了高速数据传输的标准和协议。理解这两个概念对于从事IT行业,尤其是存储解决方案...

    mh-bcs-spl-1.0-1.tar.gz_705_BCS-SPL_MH SPL_视频重建_视频重构

    基于时空相关性的分布式压缩感知多假设预测重构算法,能较好地改善视频序列的重建质量。

    SPL06-001 气压传感器_V2.0.pdf

    歌尔声学SPL06-001芯片

    SPL讲解(2)--基础设计篇

    SPL运行原理 SPL作为一个数据访问平台,最终以DLL的方式体现,那么系统只要引用SPL的DLL就可以开始应用了。 SPL将依赖于两个XML配置文件:数据源配置文件(以下我称之为DatabaseMap.xml)和实体映射文件(以下称之为...

    SPL06-001气压计和LIS3DH加速度计的IIC驱动

    SPL06-001气压计和LIS3DH加速度计的IIC驱动。IIC是hal库的IO模拟,亲测可用。不是完整工程,复制粘贴就可用。有详细注释。 SPL06好多人都说精度是0.05m,但数据手册上说的相对精度是0.5米,绝对精度接近10米。 通过...

    SPL气压计芯片手册

    - 电流消耗:在不同模式下有不同的功耗指标,待机模式下低于1μA。 - 温度传输函数和压力传输函数:分别描述了如何根据读取的传感器输出计算对应的温度和气压值。 - 定时特性:描述了芯片的时间响应特性,包括数据...

    PHP使用标准库spl实现的观察者模式示例

    PHP的标准库SPL(SPL全称为Standard PHP Library)提供了一套现成的接口和类来实现观察者模式,简化了代码编写。本文将深入探讨如何使用SPL实现观察者模式,并通过一个具体的登录处理示例进行说明。 首先,我们需要...

    SPL06-007气压传感器中文版_2019-07-08.PDF

    在开发过程中,随手翻译了一部分,该芯片007和001应该是差不多的,气压计可以用在四轴飞行器上,分享给大家,希望对大家有用!

    spl 编译原理词法分析课程设计文档

    在【SPL编译原理词法分析课程设计】中,我们关注的是如何为SPL语言构建一个词法分析器。 SPL是一种简化版的编程语言,它的设计目的是教学和测试编译器的基本概念。由于其结构清晰简单,包含了一些高级语言的语法...

Global site tag (gtag.js) - Google Analytics