学习php设计模式 php实现观察者模式(Observer)

yizhihongxing

学习PHP设计模式中的观察者模式需要掌握以下知识点:

  1. 观察者模式是怎样的一种设计模式,以及它的应用场景和作用;
  2. 观察者模式中的关键角色:被观察者(Subject)和观察者(Observer);
  3. 实现观察者模式的具体步骤:定义被观察者和观察者的接口,实现被观察者和观察者的类及其方法。

以下是实现观察者模式的完整攻略:

观察者模式概述

观察者模式是一种常见的行为型设计模式,它用于在对象之间定义一种一对多的依赖关系,这样当一个对象状态发生改变时,所有依赖它的对象都能够得到通知并自动更新。

在实际应用中,观察者模式通常被用于实现事件处理、消息推送、状态更新等功能。

观察者模式中的角色

在观察者模式中,通常有以下几种角色:

  1. Subject(被观察者):定义用于添加、移除和通知观察者的方法;
  2. Observer(观察者):定义用于接收被观察者状态变化通知的方法;
  3. ConcreteSubject(具体被观察者):实现Subject接口,它具有可以被监测的属性和状态,并在状态发生变化时通知Observer;
  4. ConcreteObserver(具体观察者):实现Observer接口,它接收Subject状态变化通知并做出相应的响应。

实现观察者模式的步骤

  1. 定义Subject和Observer接口
interface Subject {
    public function attach(Observer $observer);
    public function detach(Observer $observer);
    public function notify();
}

interface Observer {
    public function update(Subject $subject);
}
  1. 实现ConcreteSubject类
class ConcreteSubject implements Subject {
    private $observers = [];
    private $state;

    public function attach(Observer $observer) {
        $this->observers[] = $observer;
    }

    public function detach(Observer $observer) {
        foreach ($this->observers as $key => $value) {
            if ($value == $observer) {
                unset($this->observers[$key]);
            }
        }
    }

    public function notify() {
        foreach ($this->observers as $observer) {
            $observer->update($this);
        }
    }

    public function setState($state) {
        $this->state = $state;
        $this->notify();
    }

    public function getState() {
        return $this->state;
    }
}
  1. 实现ConcreteObserver类
class ConcreteObserver implements Observer {
    private $name;

    public function __construct($name) {
        $this->name = $name;
    }

    public function update(Subject $subject) {
        echo "{$this->name}观察到{$subject->getState()} 发生了变化<br>";
    }
}
  1. 示例说明
// 创建被观察者
$subject = new ConcreteSubject();

// 添加观察者
$observer1 = new ConcreteObserver('小明');
$observer2 = new ConcreteObserver('小红');

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

// 被观察者状态变化,并通知观察者
$subject->setState('测试状态1');

// 移除观察者
$subject->detach($observer2);

// 被观察者状态变化,并通知观察者
$subject->setState('测试状态2');

以上示例的输出结果为:

小明观察到测试状态1 发生了变化
小红观察到测试状态1 发生了变化
小明观察到测试状态2 发生了变化

根据输出结果可以看到,当被观察者的状态发生变化时,两个观察者对象都能够接收到通知并做出相应的响应。并且当一个观察者被移除时,不再接收到通知。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:学习php设计模式 php实现观察者模式(Observer) - Python技术站

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

相关文章

  • php实现的http请求封装示例

    让我来为您详细讲解“PHP实现的HTTP请求封装示例”的完整攻略。 前置知识 在开始介绍“PHP实现的HTTP请求封装示例”之前,您需要具备以下的前置知识: HTTP协议的基本原理和常用的请求方法(GET、POST、PUT、DELETE等) PHP的基本语法和函数库 了解常用的HTTP请求库(如:cURL) HTTP请求封装示例 HTTP请求一般包括请求方法…

    PHP 2023年5月27日
    00
  • PHP实现提取多维数组指定一列的方法总结

    下面是PHP实现提取多维数组指定一列的方法总结的攻略: 背景介绍 在开发中,经常需要对多维数组进行一些操作,比如提取其中的某一列数据。例如,一个二维数组中包含学生的姓名、分数和班级,我们需要从中提取所有学生的姓名列。 总结方法 提取多维数组的指定一列需要用到循环和数组操作。以下是常见的两种方法: 方法一:使用 foreach 循环 下面是使用 foreach…

    PHP 2023年5月26日
    00
  • PHP之sprintf函数用法详解

    PHP之sprintf函数用法详解 简介 sprintf函数是PHP语言中一个强大的格式化输出函数。它可以用于将一个字符串格式化输出为你所需要的样式并返回这个字符串。 基本语法 sprintf函数的基本语法如下: sprintf(string $format, mixed $args, …): string; 其中,$format参数为格式化字符串,$a…

    PHP 2023年5月26日
    00
  • 测试php函数的方法

    测试PHP函数的方法可以分为手动测试和自动化测试两种方式。 手动测试 手动测试是指通过手动打开网页或者执行代码来测试PHP函数的正确性和可靠性。以下是手动测试的步骤: 准备输入数据:手动输入或者生成测试数据,确保测试数据的多样性和覆盖度。 准备测试代码:编写调用函数的代码和针对输入数据的测试用例。 运行测试代码:手动执行测试代码并观察输出结果是否符合预期。 …

    PHP 2023年5月27日
    00
  • PHP编写RESTful接口

    下面是PHP编写RESTful接口的完整攻略: 1. 了解RESTful API的基本概念 REST(Representational State Transfer)是Web应用程序的一种设计风格,是现代Web应用程序开发中最常用的一种设计理念。RESTful API是基于REST原则设计的API接口,它通过HTTP协议来进行接口请求和响应。 RESTful…

    PHP 2023年5月27日
    00
  • php数组函数序列 之shuffle()和array_rand() 随机函数使用介绍

    PHP数组函数序列 之shuffle()和array_rand() 随机函数使用介绍 在PHP中,数组是非常常用的数据类型之一,对数组的操作也是非常频繁,其中,针对数组的随机函数shuffle()和array_rand()也是非常常用的。本篇文章将详细讲解这两个随机函数的使用方法。 shuffle()函数 函数说明 shuffle()函数可将数组随机排序。 …

    PHP 2023年5月26日
    00
  • php实例分享之二维数组排序

    接下来我将为您详细讲解“php实例分享之二维数组排序”的完整攻略。 一、什么是二维数组排序? 在php中,我们经常需要对数组进行排序,而如果数组是一个多维数组时,我们就需要对其进行二维数组排序。简单来说,二维数组排序就是对一个数组中的子数组进行排序,使得整个数组具有一定的顺序。 二、二维数组排序的方法详解 php中有三种主要的排序方法来对二维数组进行排序,分…

    PHP 2023年5月26日
    00
  • Windows服务器中PHP如何安装redis扩展

    Windows服务器中PHP安装Redis扩展的步骤如下: 下载php_redis.dll文件 首先,需要从官方渠道下载适合当前PHP版本的php_redis.dll文件,下载网址为https://windows.php.net/downloads/pecl/releases/redis/5.3.4/ 在下载页面中,需要根据当前PHP版本和处理器架构,选择对…

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