php 观察者模式怎么用
时间 : 2023-04-25 02:38:02声明: : 文章内容来自网络,不保证准确性,请自行甄别信息有效性

观察者模式是一种常见的设计模式,它用于实现对象间的松耦合。在 PHP 中,观察者模式可以通过 SPL(标准 PHP 库)中的 SplSubject 和 SplObserver 接口来实现。

SplSubject 接口定义了主题类的基本方法,它包括三个方法:

1. attach():添加一个观察者对象到该主题对象的观察者列表中;

2. detach():从该主题对象的观察者列表中移除一个观察者对象;

3. notify():向该主题对象的所有观察者对象发送一个通知,通知观察者对象主题对象发生了变化。

SplObserver 接口定义了观察者对象的基本方法,它包括一个方法:

1. update():当观察的主题对象发生变化时,观察者对象需要做出相应的动作。

下面我们来看一个简单的示例,该示例展示了如何使用观察者模式实现 PHP 中的事件通知机制。

```php

<?php

// 定义主题类

class EventSubject implements SplSubject

{

private $observers = [];

public function attach(SplObserver $observer)

{

$this->observers[] = $observer;

}

public function detach(SplObserver $observer)

{

$key = array_search($observer, $this->observers, true);

if ($key !== false) {

unset($this->observers[$key]);

}

}

public function notify()

{

foreach ($this->observers as $observer) {

$observer->update($this);

}

}

public function doSomething()

{

// 执行一些操作,然后通知观察者对象

$this->notify();

}

}

// 定义观察者类

class EventObserver implements SplObserver

{

public function update(SplSubject $subject)

{

echo 'EventObserver is notified.';

// 执行观察者对象的动作

}

}

// 使用

$subject = new EventSubject();

$observer = new EventObserver();

$subject->attach($observer);

$subject->doSomething();

在上面的示例中,我们通过定义主题类 EventSubject 和观察者类 EventObserver,并实现了 SplSubject 和 SplObserver 接口来实现观察者模式。主题类中的 doSomething() 方法执行一些操作,然后通过 notify() 方法通知观察者对象;观察者类中的 update() 方法定义了观察者对象应该做出的动作。在主程序中,我们创建了一个 EventSubject 对象和一个 EventObserver 对象,然后将 EventObserver 对象添加到 EventSubject 对象的观察者列表中。最后,我们通过 $subject->doSomething() 方法触发主题对象的操作,从而通知观察者对象。

总结:使用 PHP 中的观察者模式,可以实现对象间的松耦合,帮助我们编写更加稳定、灵活的代码。但是,在实际使用观察者模式时,仍需要在设计时考虑好观察者对象和主题对象之间的依赖关系,以及如何组织好观察者对象的执行顺序等细节问题。

PHP中的观察者模式是一种非常有用的设计模式,它是一种基于发布/订阅模型的行为性设计模式。在观察者模式中,一组对象中的一个对象(被称为“观察者” 或 “监听器”)监视它们中的另一组对象(被称为“主题”或“发布者”或“主管”)的状态变化。当主题对象发生改变时,所有的观察者都会自动收到有关此变化的通知,而不需要显式地调用它们。

实际上,观察者模式广泛应用于事件的处理和消息系统中,它使得各种对象的组合和扩展更加灵活和可维护。本文将通过一个简单的例子来演示如何在PHP中使用观察者模式。

首先,我们考虑一个实际的场景:一个在线商店需要实时记录并修改自己货架上商品的数量。我们可以通过观察者模式来实现这个需求。假设我们有一个购买商品的类和一个仓库管理类。购买商品的类会将购买的商品信息发送给仓库管理类,并通知仓库管理类更新货架上的库存数量。这里的购买商品类是主题,而仓库管理类是观察者,当主题发生变化时,观察者会自动被通知。

以下是具体的实现步骤:

1. 定义一个主题接口Subject和一个观察者接口Observer,以此为基础实现具体的主题和观察者类。

```php

interface Subject

{

public function attach(Observer $observer);

public function detach(Observer $observer);

public function notify();

}

interface Observer

{

public function update(Subject $subject);

}

2. 实现具体的主题类,将商品信息发送给观察者,并通知观察者更新货架库存信息。

```php

class Product implements Subject

{

private $observers = [];

private $product;

public function __construct($product)

{

$this->product = $product;

}

public function attach(Observer $observer)

{

$this->observers[] = $observer;

}

public function detach(Observer $observer)

{

foreach ($this->observers as $key => $obs)

{

if ($observer === $obs)

{

unset($this->observers[$key]);

}

}

}

public function notify()

{

foreach ($this->observers as $observer)

{

$observer->update($this);

}

}

public function buy($count)

{

echo 'Buying ' . $count . ' ' . $this->product . '<br>';

$this->notify();

}

}

class Warehouse implements Observer

{

private $product;

private $stock = 0;

public function __construct($product)

{

$this->product = $product;

}

public function update(Subject $subject)

{

if ($subject instanceof Product && $subject->getProduct() === $this->product)

{

$this->stock += $count;

echo "{$this->product} stock: {$this->stock}<br>";

}

}

}

3. 使用具体的主题和观察者类执行购买商品和更新库存操作。

```php

$product = new Product('Book');

$warehouse = new Warehouse('Book');

$product->attach($warehouse);

$product->buy(10); // 输出:Buying 10 Book and Book stock: 10

$product->buy(10); // 输出: Buying 10 Book and Book stock: 20

$product->detach($warehouse);

$product->buy(10); // 输出:Buying 10 Book

如上所示,在使用观察者模式时,我们将购买商品类(主题)和管理库存类(观察者)分别实现了自己的抽象类,使得它们互不依赖,并且符合单一职责原则和开放封闭原则。利用观察者模式可实现更加灵活的系统架构设计,使系统具备更高的可扩展性、可维护性和可重用性。