PHP设计模式中观察者模式详解

PHP设计模式中观察者模式详解

观察者模式是一种行为型设计模式,它允许对象在状态发生改变时自动通知它对象。在PHP中,观察者模式通常用于实现事件驱动的编程模型。

观察者模式的实现

观察者模式通常由两个主要组件组成:主题和观察者。主题是一个对象,维护一组观察者,并状态发生改变时通知它们。观察者是一个接口,它定义了在主题状态发生变时需要执行的操作。

以下是察者模式的实现步骤:

  1. 定义主题接口

主题接口定义了添加、删除和通知观察者的方法。

interface Subject {
  public function attach(Observer $observer);
  public function detach(Observer $observer);
  public function notify();
}

在这个示例中,我们定义了一个Subject接口,它包含了attach()detach()notify()方法。

  1. 定义观察者口

观察者接口了在主题状态发生改变时需要执行的操作。

interface Observer {
  public function update(Subject $subject);
}

在这个示例中,我们定义了一个Observer接口,它包含了update()方法。

  1. 实现主题类

主题类现了主题接口,并维护了一组观察者。

class ConcreteSubject implements Subject {
  private $observers = [];

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

  public function detach(Observer $observer) {
    $index = array_search($observer, $this->observers);
    if ($index !== false) {
      unset($this->observers[$index]);
    }
  }

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

在这个示例中,我们实现了一个ConcreteSubject类,它实现了Subject接口,并维护了一组观察者。

  1. 实现观察者类

观察者类实现了观察者口,并在主题状态发生改变时执行相应的操作。

class ConcreteObserver implements Observer {
  public function update(Subject $subject) {
    // 在主题状态发生改变时执行相应的操作
  }
}

在这个示例中,我们实现了ConcreteObserver,它实现了`Observer接口,并在主题状态发生改变时执行相应的操作。

  1. 使用观察者模式

使用观察者模式时,需要创建一个主题对象,并向它添加一组观察者。当主题状态发改变时,调用主题对象的notify()方法通知观察者。

以下是使用观察者模式的示例:

// 创建题对象
$subject = new ConcreteSubject();

// 创建观察者对象
$observer1 = new ConcreteObserver();
$observer2 = new ConcreteObserver();

// 向主题对象添加观察者
$subject->attach($observer1);
$subject->attach($observer2);

// 当主题状态发生改变时,通知观察者
$subject->notify();

在这个示例中,我们创建了一个主题对象和两个观察者对象,并向主题对象添加了这两个观察者。当主题状态发生改变时,调用主题对象的notify()方法通知观察者。

示例1:使用观察者模式实现事件监听器

以下是使用观察者模式实现事件监听器的示例:

// 定义主题接口
interface EventSubject {
  public function attach(EventObserver $observer);
  public function detach(EventObserver $observer);
  public function notify($event);
}

// 定义观察者接口
interface EventObserver {
  public function handle($event);
}

// 实现主题类
class Event implements EventSubject {
  private $observers = [];

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

  public function detach(EventObserver $observer) {
    $index = array_search($observer, $this->observers);
    if ($index !== false) {
      unset($this->observers[$index]);
    }
  }

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

// 实现观察者类
class LogObserver implements EventObserver {
  public function handle($event) {
    // 记录事件日志
  }
}

// 使用观察者模式
$event = new Event();
$event->attach(new LogObserver());
$event->notify('event occurred');

在这个示例中,我们使用观察者模式实现了一个事件监听器。当事件发生时,调用主题对象的notify()方法通知观察者。

示例2:使用观察者模式实现MVC模式

以下是使用观察者模式实现MVC模式的示例:

// 定义主题接口
interface ModelSubject {
  public function attach(ModelObserverobserver);
  public function detach(ModelObserver $observer);
  public function notify();
}

// 定义观察者接口
interface ModelObserver {
  public function update(ModelSubject $subject);
}

// 实现主题类
class Model implements ModelSubject {
  private $observers = [];
  private $data = [];

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

  public function detach(ModelObserver $observer) {
    $index = array_search($observer, $this->observers);
    if ($index !== false) {
      unset($this->observers[$index]);
    }
  }

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

  public function setData($data) {
    $this->data = $data;
    $this->notify();
  }

  public function getData() {
    return $this->data;
  }
}

// 实现观察者类
class View implements ModelObserver {
  public function update(ModelSubject $subject) {
    $data = $subject->getData();
    // 更新视图
  }
}

// 使用观察者模式
$model = new Model();
$view = new View();
$model->attach($view);
$model->setData(['foo' => '']);

在这个示例中,我们使用观察者模式实现了MVC模式。当模型数据发生改变时,调用主题对象的notify()方法通知观察者更新视图。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PHP设计模式中观察者模式详解 - Python技术站

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

相关文章

  • php进程通信之信号量浅析介绍

    首先我们来讲解一下PHP中的进程间通信机制——信号量。信号量是一种进程同步互斥机制,常用于多个进程的访问共享资源时实现进程同步,控制资源并发访问的数目等。 什么是信号量? 信号量是一个计数器。当一个进程进入临界区(访问共享资源),它先检查信号量。如果信号量的值为正,则表示资源可用,进程可以安全地访问临界区。如果值为零,则表示所有资源都处于被占用的状态。此时进…

    PHP 2023年5月27日
    00
  • 约苗怎么预约接种疫苗?约苗预约接种疫苗教程

    约苗怎么预约接种疫苗?约苗预约接种疫苗教程 1. 前言 由于新冠疫情的影响,目前全国范围内正在进行疫苗接种工作。为了更高效、快捷地走出疫情,越来越多的地区采用“约苗”方式进行接种预约。那么,在这里我们来介绍一下如何进行“约苗”预约接种的具体流程。 2. 接种要求 在进行“约苗”预约接种之前,需要具备以下条件: 年满18岁且符合接种条件的人员; 确认所在社区疫…

    PHP 2023年5月23日
    00
  • PHP7数组的底层实现示例

    下面是 PHP7 数组的底层实现示例的详细攻略。 什么是 PHP7 数组? PHP7 数组指的是 PHP 语言中的数组类型,它是一种可以存储多个值的数据类型。PHP 数组的特点是可以动态地添加、删除和修改元素,而且支持多种不同类型的元素。在 PHP7 中,数组的底层实现有了很大改进,提高了数组的性能和效率。 PHP7 数组的底层实现 PHP7 数组的底层实现…

    PHP 2023年5月27日
    00
  • php;//filter的介绍和应用

    知识点 php://filter php://filter是一种元封装器,是PHP中特有的协议流,设计用于数据流打开时的筛选过滤应用,作用是作为一个“中间流”来处理其他流。php://filter目标使用以下的参数作为它路径的一部分。复合过滤链能够在一个路径上指定。 名称 描述 备注 resource=<要过滤的数据流> 指定了你要筛选过滤的数据…

    PHP 2023年4月18日
    00
  • PHP编写文件多服务器同步程序

    让我用Markdown格式写一份“PHP编写文件多服务器同步程序”的攻略教程。 PHP编写文件多服务器同步程序 背景介绍 在开发Web应用程序过程中,我们通常需要将网站相关文件部署到多台服务器上,以提升网站的性能、可用性等方面的表现。而基于互联网的分布式架构,我们无法预测访问我们网站的用户会访问到哪个服务器上,因此,为了确保多台服务器之间的文件的一致性,我们…

    PHP 2023年5月27日
    00
  • php 301转向实现代码

    PHP 301转向可以帮助我们实现网站的页面重定向,常用于网站迁移、链接变更、重定向已经删除的页面等。下面我将为大家提供一份完整的攻略,包括相关代码示例。 什么是301转向 301转向是一种HTTP状态码,用于告诉搜索引擎和浏览器某个网址已经永久性移动到了另一个地址。通常我们需要进行301重定向是因为以下情况: 网站更换了域名 更改网站的目录结构或者网站链接…

    PHP 2023年5月23日
    00
  • php数组的概述及分类与声明代码演示

    下面给出详细讲解“PHP数组的概述及分类与声明代码演示”的完整攻略。 PHP数组的概述 数组是存储多个值的变量。在 PHP 中,数组是一种可以存储多个值的特殊变量类型。数组中的每个值都有一个对应的键,通过键来访问数组中的值。可以认为,数组是由多个键值对组成的集合。 PHP 数组有以下几个特点:1. 数组可以包含任意数量的值;2. 数组中的每个值都有一个对应的…

    PHP 2023年5月23日
    00
  • PHP中常用的魔术方法

    使用魔术方法(Magic Methods)可以使得 PHP 编程变得更加简单和方便。魔术方法是一些特殊的函数,它们以 __ 作为前缀,用于在类中处理某些操作,比如对象的创建和销毁、访问未定义的属性、调用不存在的方法等。 下面让我们来详细讲解 PHP 中常用的魔术方法: __construct() __construct() 方法是一个特殊的构造函数,用于在对…

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