PHP观察者模式

目录
  1. 一般通知
  2. 什么是观察者模式
    1. 观察者接口类
    2. 观察事件通知
    3. 测试
    4. 输出

一般通知

当不用观察者模式的时候,我们需要一个一个的通知对象更新。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?php

/**
* 观察者1
*/
class Observer1
{
function update($event_info = 'Observer1')
{
echo "逻辑$event_info<br/>";
}
}

/**
* 观察者2
*/
class Observer2
{

function update($event_info = 'Observer2')
{
echo "逻辑$event_info<br/>";
}
}

class Event
{
function trigger()
{
$observer1 = new Observer1;
$observer1->update();

$observer2 = new Observer2;
$observer2->update();
}
}

$event = new Event();
$event->trigger();

什么是观察者模式

当一个对象状态发生改变时,依赖它的对象全部会收到通知,并自动更新。

将观察者添加进事件对象列表,可以添加、删除,然后轮询通知

观察者接口类

1
2
3
4
5
6
7
8
<?php
/**
* 观察者接口
*/
interface Observer
{
function update($event_info = null);
}

观察事件通知

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php

require 'Observer.php';

/**
* 事件
*/
abstract class EventGenerator
{
private $observers = [];

/**
* 添加观察者
*/
function addObserver($key, Observer $observer)
{
$this->observers[$key] = $observer;
}

/**
* 删除观察者
*/
function removeObserver($key)
{
unset($this->observers[$key]);
}

/**
* 事件通知
*/
function notify()
{
foreach ($this->observers as $key => $observer) {
$observer->update();
}
}
}

测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<?php

require 'EventGenerator.php';

class Event extends EventGenerator
{

function trigger()
{
echo "Event".__METHOD__."<br/>";
$this->notify();
}
}


/**
* 观察者1
*/
class Observer1 implements Observer
{
function update($event_info = 'Observer1')
{
echo "逻辑$event_info<br/>";
}
}

/**
* 观察者2
*/
class Observer2 implements Observer
{

function update($event_info = 'Observer2')
{
echo "逻辑$event_info<br/>";
}
}


$event = new Event();
$event->addObserver('Observer1', new Observer1);
$event->addObserver('Observer2', new Observer2);
$event->trigger();

输出

1
2
3
EventEvent::trigger
逻辑Observer1
逻辑Observer2