观察者模式是非常有用的设计模式,事件机制,发布订阅等都是基于观察者模式实现的。
观察者模式顾名思义要有“观察者”和“被观察者”,为了约束两者的行为,又需要各自的接口(Interface)。我们来实现一个Demo:
ObserverInterface.php
<?php
/**
* Interface ObserverInterface 观察者接口
*/
interface ObserverInterface
{
/**
* 收到主题通知后执行相应的反馈
* @return mixed
*/
public function response();
}
ObserverA.php
<?php
require_once 'ObserverInterface.php';
/**
* Class ObserverA 第一种观察者
*/
class ObserverA implements ObserverInterface
{
public function response()
{
echo '观察者A已收到' . PHP_EOL;
}
}
ObserverB.php
<?php
/**
* Class ObserverB 第二种观察者
*/
class ObserverB implements ObserverInterface
{
public function response()
{
echo 'Observer B has received the notify' . PHP_EOL;
}
public function ohter()
{
echo '该种观察者独有的方法';
}
}
SubjectInterface.php
<?php
/**
* Interface SubjectInterface 主题接口
*/
interface SubjectInterface
{
/**
* @param ObserverInterface $observer
*/
public function add(ObserverInterface $observer);
/**
* 通知观察者
*/
public function notify();
}
Subject.php
<?php
require_once 'SubjectInterface.php';
/**
* Class Subject 被观察的对象
*/
class Subject implements SubjectInterface
{
/**
* @var $observers Observer
*/
private $observers;
/**
* @param ObserverInterface $observer 注册观察者实体
*/
public function add(ObserverInterface $observer)
{
$this->observers[] = $observer;
}
/**
* 发送通知
*/
public function notify()
{
// 逐个通知观察者
foreach ($this->observers as $observer) {
$observer->response();
}
}
}
下面我们来模拟一下场景
<?php
require_once 'Subject.php';
require_once 'ObserverA.php';
require_once 'ObserverB.php';
//观察者模式
$Subject = new Subject();
$Subject->add(new ObserverA());
$Subject->add(new ObserverB());
$Subject->notify();
执行结果:
观察者A已收到
Observer B has received the notify