观察者模式为您提供了避免组件之间紧密耦合的另一种方法
这种模式是什么原理呢?
咱们需要先知道什么是观察者, 大家有玩过斗地主的吧. 没玩过也见过. 就是有的人可以参与游戏.而有的人可以在边上观战. 这种观战的人,就叫观察者.
设计模式中的观察者是什么意思呢?咱们就以实际的案例来描述这个模式 有时候,比如发广告,需要群发邮件通知一下,那怎么做呢(简单的场景,并不符合现实情况)
这时,需要写一个类(注册器,也就是被观察者)用于注册和通知功能. 另一个类(观察者)就是用来具体通知动作的类.代码如下
[PHP] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
<?php /** * 注册的注册器功能 */ class Register { public $mObList = []; //观察者列表 /** * 注册方法 */ public function registerObj( $obj ) { $this ->mObList[] = $obj ; } /** * 执行通知 */ public function send() { foreach ( $this ->mObList as $obj ) { $obj ->sendMessage(); } } } /** * 通知类的接口类(观察者接口) */ interface INotify { /** * 发送消息的功能 */ public function sendMessage(); } /** * 邮件通知的类(观察者) */ class Email implements INotify { /** * 以邮箱的方式发送消息 */ public $mEmail = '' ; public function __construct( $email ) { $this ->mEmail = $email ; } public function sendMessage() { echo $this ->mEmail . '已经邮件通知!<hr/>' ; } } //功能实现代码 $observer = new Register(); //实例化注册器 //注册多个观察观 $observer ->registerObj( new Email( '123@php20.com' )); $observer ->registerObj( new Email( '234@php20.com' )); $observer ->registerObj( new Email( '345@php20.com' )); $observer ->registerObj( new Email( '456@php20.com' )); $observer ->registerObj( new Email( '567@php20.com' )); $observer ->registerObj( new Email( '678@php20.com' )); //发送消息 $observer ->send(); ?> |
执行结果:
123@php20.com已经邮件通知!
234@php20.com已经邮件通知!
345@php20.com已经邮件通知!
456@php20.com已经邮件通知!
567@php20.com已经邮件通知!
678@php20.com已经邮件通知!