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

学习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 截取字符串专题集合

    PHP 截取字符串专题集合 在PHP开发中,我们经常需要对字符串进行截取操作,如截取指定长度的字符串、截取指定字符之前或之后的字符串等等。本篇文章将对PHP截取字符串的完整攻略进行详细讲解。 1. substr函数 substr函数是PHP内置的字符串截取函数,用法如下: substr(string $string, int $start, int $len…

    PHP 2023年5月26日
    00
  • 微信小程序如何获取用户信息

    微信小程序可以通过用户授权方式来获取用户信息,具体步骤如下: 在微信公众平台中,开发者需要设置小程序的“授权选项”,勾选需要获取的用户信息。 在小程序中,调用wx.login()获取用户code,然后使用wx.getUserInfo()方法获取用户信息。 下面是两个示例: 示例一: 打开 app.json 文件,配置一下小程序可以获取到的用户数据。 { &q…

    PHP 2023年5月23日
    00
  • php5.5新数组函数array_column使用

    针对”php5.5新数组函数array_column使用”这个话题,我准备了以下的详细讲解攻略,其中包括了基本语法、参数说明、返回值、相关示例和注意事项等内容。 1. 前言 array_column 是 PHP 5.5 中新增的数组函数,用于从给定的多维数组中提取单列的值。它可以简化相关数组的操作,并且让代码更加简洁易懂。 2. 基本语法 array_col…

    PHP 2023年5月26日
    00
  • thinkphp中字符截取函数msubstr()用法分析

    ThinkPHP中字符截取函数msubstr()用法分析 简介 msubstr() 是 ThinkPHP 框架提供的一个字符串截取函数,主要用于中文字符截取,可以避免因为中文字符使用 substr() 函数造成的截取不准确的问题。 函数定义 msubstr($str,$start,$length,$charset="utf-8",$suf…

    PHP 2023年5月26日
    00
  • PHP 构造函数和析构函数原理与用法分析

    PHP 构造函数和析构函数原理与用法分析 什么是构造函数和析构函数 构造函数和析构函数是面向对象编程中的概念,它们是一个类中的两种特殊的方法。在 PHP 中,构造函数和析构函数可以分别用 __construct 和 __destruct 这两个方法名来定义。 构造函数 构造函数作用于对象被实例化时自动调用,用于初始化对象的属性,将参数传递给对象并设置一些默认…

    PHP 2023年5月27日
    00
  • 小结下MySQL中文乱码,phpmyadmin乱码,php乱码 产生原因及其解决方法第1/3页

    下面我将详细讲解“小结下MySQL中文乱码,phpmyadmin乱码,php乱码 产生原因及其解决方法第1/3页”的完整攻略。 产生原因 在MySQL、phpmyadmin和php中出现中文乱码的原因主要有两个:1. 字符集不一致:MySQL、phpmyadmin和php的字符集设置不一致,导致中文字符显示为乱码。2. 数据库、表或字段的字符集设置不正确:如…

    PHP 2023年5月27日
    00
  • 利用php递归实现无限分类 格式化数组的详解

    下面是关于利用PHP递归实现无限分类格式化数组的详细攻略: 什么是无限分类? 无限分类指的是在同一层级下,一个分类下又可以有多个子分类,每一个子分类下又可以有多个子分类,以此类推,形成一个无限分类的层级结构。一般用于商品分类、新闻分类等网站分类。 如何实现无限分类? 在PHP中,可以利用递归函数来实现无限分类,格式化数组并输出。下面是具体实现步骤: 定义一个…

    PHP 2023年5月26日
    00
  • 关于二级目录拖拽排序的实现(源码示例下载)

    首先,需要先说明一下什么是二级目录拖拽排序。这是指在一个树形结构的目录中,除了根节点之外还有一层节点,这些节点是可以拖拽进行排序的。 在实现二级目录拖拽排序时,需要注意以下几点: 确定数据结构 需要确定存储每个节点数据的数据结构,常见的是使用树形结构(包含根节点和子节点)或者数组结构(将每个节点的父子关系以及排序位置都存储在一个数据对象中)。 使用拖拽事件 …

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