PHP观察者模式原理与简单实现方法示例

yizhihongxing

下面就详细讲解一下“PHP观察者模式原理与简单实现方法示例”的完整攻略。

什么是观察者模式?

观察者模式是一种软件设计模式,通过定义一种一对多的依赖关系,以便于多个对象同时处理某一个任务。在该模式中,一个被观察的主题(即可观察者)维护一组观察者集合,它们依赖于该主题。当主题状态发生改变时,它会自动通知观察者们,使得它们能够自动更新自己的状态。

观察者模式的实现原理

观察者模式的实现原理可以用以下3个角色来进行描述:

  • Subject(主题): 它是被观察的对象,它可以有多个观察者,并且提供对观察者的注册和删除等操作,同时它必须定义一个接口让观察者能够进行状态更新。
  • Observer(观察者): 它是观察Subject的对象,当Subject的状态被修改时,Observer将获得通知并进行相应的处理。
  • ConcreteSubject(具体主题): 它是具体被观察的对象,它实现了Subject接口,它发送通知以更改观察者的状态。
  • ConcreteObserver(具体观察者): 它是具体的观察者对象,实现了Observer接口,以便通过Subject接收通知实时更新自己的状态。

PHP观察者模式示例1

下面我们来看一个简单的示例来说明PHP中观察者模式的实现。

Subject主题类的实现

class Subject
{
    private $observers = array();
    private $state;

    // 添加观察者
    public function attach(Observer $observer)
    {
        array_push($this->observers, $observer);
    }

    // 移除观察者
    public function detach(Observer $observer)
    {
        $key = array_search($observer, $this->observers);
        if ($key !== false) {
            unset($this->observers[$key]);
        }
    }

    // 通知观察者
    public function notify()
    {
        foreach($this->observers as $observer) {
            $observer->update();
        }
    }

    // 设置状态
    public function setState($state)
    {
        $this->state = $state;
        $this->notify();
    }

    // 获取状态
    public function getState()
    {
        return $this->state;
    }
}

Observer观察者类的实现

interface Observer
{
    public function update();
}

class ConcreteObserver1 implements Observer
{
    public function update()
    {
        echo "ConcreteObserver1 has been notified.\n";
    }
}

class ConcreteObserver2 implements Observer
{
    public function update()
    {
        echo "ConcreteObserver2 has been notified.\n";
    }
}

客户端代码的实现

$subject = new Subject();

$observer1 = new ConcreteObserver1();
$observer2 = new ConcreteObserver2();

$subject->attach($observer1);
$subject->attach($observer2);

$subject->setState('STATE1');
$subject->setState('STATE2');

$subject->detach($observer2);

$subject->setState('STATE3');

输出结果:

ConcreteObserver1 has been notified.
ConcreteObserver2 has been notified.
ConcreteObserver1 has been notified.
ConcreteObserver2 has been notified.
ConcreteObserver1 has been notified.

PHP观察者模式示例2

下面我们再来看另一个示例,这个示例将更直观地展示观察者模式的用法。

Subject主题类的实现

class User
{
    private $email;
    private $observers = array();

    // 添加观察者
    public function attach(Observer $observer)
    {
        array_push($this->observers, $observer);
    }

    // 移除观察者
    public function detach(Observer $observer)
    {
        $key = array_search($observer, $this->observers);
        if ($key !== false) {
            unset($this->observers[$key]);
        }
    }

    // 通知观察者
    public function notify()
    {
        foreach($this->observers as $observer) {
            $observer->update($this);
        }
    }

    // 设置email并通知观察者
    public function setEmail($email)
    {
        $this->email = $email;
        $this->notify();
    }

    // 获取email
    public function getEmail()
    {
        return $this->email;
    }
}

Observer观察者类的实现

interface Observer
{
    public function update(User $user);
}

class EmailSender implements Observer
{
    public function update(User $user)
    {
        $email = $user->getEmail();
        echo "Sending email to: {$email}\n";
    }
}

class UserLogger implements Observer
{
    public function update(User $user)
    {
        $email = $user->getEmail();
        echo "User email changed: {$email}\n";
    }
}

客户端代码的实现

$user = new User();

$emailSender = new EmailSender();
$userLogger = new UserLogger();

$user->attach($emailSender);
$user->attach($userLogger);

$user->setEmail('example@mail.com');

$user->detach($userLogger);

$user->setEmail('new_example@mail.com');

输出结果:

Sending email to: example@mail.com
User email changed: example@mail.com
Sending email to: new_example@mail.com

以上就是PHP观察者模式原理与简单实现方法示例的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PHP观察者模式原理与简单实现方法示例 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • 详解jQuery uploadify文件上传插件的使用方法

    详解jQuery uploadify文件上传插件的使用方法 概述 jQuery uploadify是一个轻量级的文件上传插件,基于jQuery框架实现。它支持多文件上传、进度条显示、拖拽上传等功能,在前端实现文件上传功能非常方便。 安装 从jQuery uploadify官网(https://www.uploadify.com/)下载最新版本的插件,将其解压…

    PHP 2023年5月27日
    00
  • php中mysql连接和基本操作代码(快速测试使用,简单方便)

    这里是关于“php中mysql连接和基本操作代码”的完整攻略。 MySQL连接代码 在PHP中连接MySQL需要使用到PHP内置的MySQLi扩展或PDO扩展。这里我们以MySQLi扩展为例来介绍。 创建数据库连接 <?php $servername = "localhost"; $username = "username…

    PHP 2023年5月23日
    00
  • PHP中绘制图像的一些函数总结

    PHP中绘制图像的一些函数总结 简介 PHP是一种广泛使用的服务器端编程语言,在Web开发中具有重要的地位。PHP提供了丰富的图像处理函数,它们可以用来创建、修改、处理图像,同时还能够把图像输出到浏览器或保存到文件中。 本篇文章将总结一些在PHP中常用的绘制图像的函数,包括画线、画矩形、画圆、画多边形、画弧等等。 我们将使用PHP GD库来实现这些功能。GD…

    PHP 2023年5月25日
    00
  • PHP购物车类Cart.class.php定义与用法示例

    “PHP购物车类Cart.class.php定义与用法示例”是一个用于实现网站购物车功能的PHP类。以下是该类的定义和使用说明: 定义 文件名:Cart.class.php 类名:Cart 属性: $cartId:购物车id $products:购物车商品列表 方法: __construct():构造函数,初始化购物车id和商品列表 add():添加商品到购…

    PHP 2023年5月26日
    00
  • php实现图片上传并进行替换操作

    下面是php实现图片上传并进行替换操作的完整攻略: 1. 准备工作 在进行图片上传和替换操作之前,我们需要先创建一个上传表单,表单中包含一个用于选择文件的input和一个用于提交表单的button。同时我们需要准备一个接收表单数据的php文件,用于处理上传操作并进行替换。 示例表单代码如下: <form action="upload.php&…

    PHP 2023年5月27日
    00
  • PHP中=>和->以及::符号的用法

    PHP中=>和->以及::符号的用法,分别表示不同的语法类型和功能。 1. =>符号 1.1. 定义数组 在PHP中,=>符号常用来定义关联数组,表示“键=>值”的关系。 示例: // 定义关联数组 $menu = array( ‘home’ => ‘首页’, ‘about’ => ‘关于我们’, ‘contact’…

    PHP 2023年5月23日
    00
  • 微信小程序实战之登录页面制作(5)

    下面是详细的攻略: 微信小程序实战之登录页面制作(5) 1. 登录验证和获取用户信息 首先,在 login.js 文件中,我们需要编写登录验证和获取用户信息的代码。具体步骤如下: 定义全局变量 app,用于保存小程序的实例 在 onLoad 函数中,获取小程序的实例,并将其保存到全局变量 app 中 在 getUserInfo 函数中,调用 wx.getUs…

    PHP 2023年5月23日
    00
  • 用php+mysql一个名片库程序

    下面我将详细讲解如何使用PHP和MySQL来创建一个名片库程序,包括以下步骤: 步骤一:创建数据库表和字段 首先,我们需要在MySQL中创建一个名为“business_cards”的数据库,然后创建一个名为“cards”的数据表,表中要包括以下字段: id:自增主键,用于标识每一张名片的唯一性 name:名片拥有者的姓名 title:名片拥有者的职称 com…

    PHP 2023年5月30日
    00
合作推广
合作推广
分享本页
返回顶部