一、概述
观察者模式,当一个对象状态发生变化时,依赖它的对象会收到通知,自动更新,观察者模式比较贴切于业务
二、核心
- 属于行为型模式
- 将行为独立模块化,降低行为和主题的耦合性,非侵入式通知和更新机制
- 消息队列、事件都使用了观察者模式
三、结构图
四、代码示例
<?php
/*
* 观察者模式
*/
//定义观察者接口
interface SplObserver
{
public function update(SplSubject $subject); //注册观察者到被观察者(主题)
}
//定义被观察者接口(主题)
interface SplSubject
{
public function attach(SplObserver $observer); //注册观察者到被观察者类中
public function detach(SplObserver $observer);//将观察者从被观察者类中删除
public function notify(); //被观察者发生改变时通知所有观察者
}
//实现被观察者类接口
class subjectInstance implements SplSubject
{
private $observer = array(); //存储观察者集合
//将观察者注册到被观察者类中(主题类中)
public function attach(SplObserver $observer)
{
$this->observer[] = $observer;
}
//删除主题类中的观察者类
public function detach(SplObserver $observer)
{
$key = array_search($observer, $this->observer, true);
if ($key !== false) {
unset($this->observer[$observer]);
return true;
}
return false;
}
//通知所有观察者,并做出相应的改变
public function notify()
{
if (!empty($this->observer)) {
foreach ($this->observer as $key => $observer) {
$observer->update($this);
}
}
}
}
class observerA implements SplObserver
{
public function update(SplSubject $subject)
{
echo "观察者A,做出相应的改变". PHP_EOL;
}
}
class observerB implements SplObserver
{
public function update(SplSubject $subject)
{
echo "观察者B,做出相应的改变". PHP_EOL;
}
}
//用户类
class client
{
public $subjectObj;
//注册观察者A,B到被观察者中
public function __construct()
{
$this->subjectObj = new subjectInstance();
$this->subjectObj->attach(new observerA());
$this->subjectObj->attach(new observerB());
// $subjectObj->detach(new obseverC());
}
//注册完成后如果被观察者有改变,通知观察者
public function exec()
{
//主业务
$this->subjectObj->notify();
}
}
$obj = new client();
$obj->exec();
五、总结
设计模式更多的是一种想法,一种风格,遵循但不局限于设计模式。设计模式为了让代码更加简洁,降低代码之间的耦合性,使代码更容易扩展。