当我们学习一门新的技术或方法的时候,一定要弄清楚这技术是为了解决什么具体的问题。
这么做之后有什么好处。

观察者模式

日常开发过程中,经常会遇到如下的场景:
当用户登录成功时,给用户发送消息推送。当某笔账单回款100%时,执行某些特定的业务逻辑,比如给用户账户加钱或是通知其它模块。
一般来讲,我们实现时会直接采用如下的过程式编码:

1
2
3
4
5
6
7
8
...
$res = Login();
if ($res) {
notify();
}
if ($condition) {
//do something
}

当需要推送的类型越来越多,代码越加越多,时间久了会越来越难维护。
这个时候,为了分离单一职责,让特定的类负责特定的功能。采用观察者模式可以很好地解决这个问题。

观察者模式的核心是把客户元素(观察者)从一个中心类(主体)中分离开来。当主体知道事件发生时,观察者需要被通知。同时,我们希望主体与观察者之间的关系没有硬编码。

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
class Login implements Observable {
private $observers;
//...
function __construct() {
$this->observers = array();
}

function attach(Observer $observer) {
$this->observers[] = $observer;
}

function detach(Observer $observer){
$newobservers = array();
foreach($this->observers as $obs) {
if($obs !== $observer) {
$newobservers[] = $obs;
}
}
$this->observers = $newobservers;
}

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

未完待续…