在平常的工作中我们很习惯用我们惯有的思维模式去完成一个新的需求任务, 但是很有可能在不久的将来, 这段在当时看起来比较完整的代码, 很可能需要很大程度的去重构才能应付当下的需求。
在软件架构下, 一个程序的可扩展是非常重要的, 而我们的惯有思维往往只基于当下的场景需要去做思考, 这时我们需要一些新的思维模式去使我们的软件足够应付项目的扩张以及需求的变更, 所以设计模式变成了很好的思想源泉, 接下下一段时间我将会陆续的学习一些常用设计模式以及贴上代码片段。

什么是观察者模式

观察者模式顾名思义以观察创建的模式, 观察需要监听的对象, 一旦有变化将会被通知。而php本身也提供了两个抽象的接口,SplSubjectSplObserver

观察者模式的实践

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
<?php

//被观察方
Class userRegisterSplSubject implements SplSubject{
private $observers = [];
public $user = null;
public function __construct($name)
{
//注册user
$user = new stdClass();
$user->id = 1;
$user->name = $name;
$user->phone = '188888888';

$this->user = $user;
}

public function attach (SplObserver $observer)
{
$id = spl_object_hash($observer);
$this->observers[$id] = $observer;
}

public function detach (SplObserver $observer)
{
$id = spl_object_hash($observer);
if (isset($this->observers[$id])) {
unset($this->observers[$id]);
}
}

public function notify ()
{
foreach($this->observers as $ob)
{
$ob->update($this);
}
}
}


//邮件观察
Class sendMail implements SplObserver{
public function update(SplSubject $subject)
{
//发送邮件
echo "正在给{$subject->user->name}发送邮件\n";
}
}

//优惠券观察
Class sendCoupon implements SplObserver{
public function update(SplSubject $subject)
{
//赠送优惠券
echo "正在给{$subject->user->name}赠送优惠券\n";
}
}


//通知观察者
$userRegisterSubject = new userRegisterSplSubject('韩');
$userRegisterSubject->attach(new sendMail());
$userRegisterSubject->attach(new sendCoupon());
$userRegisterSubject->notify();

代码很简单, 就不多做赘述了, 在一些数据需要被多方应用时候观察者模式很合适的应用这些场合, 不需要重复的代码累赘在一个数据后方, 很好的解耦业务逻辑。