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

yizhihongxing

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日

相关文章

  • 跟我学小偷程序之成功偷取首页(第三天)

    下面就是对“跟我学小偷程序之成功偷取首页(第三天)”完整攻略的详细讲解。 1. 寻找目标站点 首先,我们需要找到一个目标站点,并分析其网页源代码。我们可以使用浏览器开发者工具或其他工具查看网页的源代码。 当找到目标站点后,我们要注意以下几点: 查看目标站点是否有反爬措施; 观察目标站点的网页结构,了解它的网页标签和元素的特点; 确定我们要爬取的内容和对应的标…

    PHP 2023年5月23日
    00
  • PHP入门教程之字符串处理技巧总结(转换,过滤,解析,查找,截取,替换等)

    PHP入门教程之字符串处理技巧总结 介绍 PHP中字符串是必不可少的。字符串处理是几乎所有Web应用程序的必备特点。在这篇文章中,我们将介绍有关PHP字符串的各种技巧,包括字符串的转换、过滤、解析、查找、截取、替换等。 字符串转换 将字符串转为小写或大写 $string = "Hello, World!"; $lowercase = st…

    PHP 2023年5月26日
    00
  • php中pcntl_fork创建子进程的方法实例

    下面是关于“php中pcntl_fork创建子进程的方法实例”的完整攻略: 什么是pcntl_fork? pcntl_fork是php的一个系统调用函数,用于在当前进程中创建一个子进程。通过PCNTL扩展模块提供的函数可以使用这个系统调用。 pcntl_fork的实现原理 pcntl_fork的实现原理是通过复制当前进程创建一个新的进程,这个新进程拥有与父进…

    PHP 2023年5月30日
    00
  • php数组函数序列之array_pop() – 删除数组中的最后一个元素

    下面是对php数组函数序列之array_pop()的详细讲解。 标题 php数组函数序列之array_pop() – 删除数组中的最后一个元素 简介 在php中,array_pop()函数用于删除一个数组中的最后一个元素,并返回该元素。 语法 array_pop(array $array): mixed 参数 array:必需,要进行操作的数组。 返回值 返…

    PHP 2023年5月26日
    00
  • PHP终止脚本执行的实例代码

    当在PHP脚本中遇到某些错误或条件时,可能需要立即终止脚本的执行。这时可以使用几种不同的方法来停止PHP脚本的执行,下面将详细讲解这些方法的实现方式。 使用die()函数 使用die()函数可以在脚本中任何位置立即停止代码的执行,并向浏览器输出一条消息,通常使用此函数来表明一些错误信息或调试信息。下面是一个简单的示例代码: <?php $num = 1…

    PHP 2023年5月23日
    00
  • php常用数组array函数实例总结【赋值,拆分,合并,计算,添加,删除,查询,判断,排序】

    下面我将详细讲解php常用数组array函数实例总结。 1. 数组赋值的常用方式 1.1 直接赋值 通过直接赋值的方式来创建一个数组,包括两种形式: // 键值对数组 $arr1 = [‘name’ => ‘Tom’, ‘age’ => 18, ‘gender’ => ‘male’]; // 索引数组 $arr2 = [‘apple’, ‘…

    PHP 2023年5月26日
    00
  • PHP获取redis里不存在的6位随机数应用示例【设置24小时过时】

    “PHP获取redis里不存在的6位随机数应用示例【设置24小时过时】”攻略是指通过PHP代码实现从Redis中随机取出一个六位数,如果该六位数不存在于Redis中,则将其存入Redis,并设置24小时过期时间的操作过程。下面是详细的步骤和示例。 环境准备 在开始之前,需要安装Redis服务,并安装PHP Redis扩展。同时需要在PHP代码中配置Redis…

    PHP 2023年5月26日
    00
  • 通过PHP简单实例介绍文件上传

    文件上传是Web开发中常见的功能之一,用户可以通过将本地文件上传到服务器,实现数据传输和共享。PHP提供了丰富的函数和扩展库来处理文件上传操作。本文将通过一个简单的实例,介绍PHP如何实现文件上传。 如何实现文件上传 创建上传界面HTML代码 文件上传需要用户界面来触发操作,一般是HTML表单,可以通过<input>标签的type=file属性来…

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