其实不用刻意去学习模式,我们平常看代码,写代码的过程中已经接触或使用过不少设计模式,只是我们不知道罢了。但是我们仍然需要了解一下书上的说法,对比印证一下,加深理解。
本文说的是设计模式:观察者模式
根据字面意思理解,我们知道关键字是“观察”两个字,这是一个动词,那么就需要有"被观察者"和"观察者"。
举个栗子:
公司有一台很重要的线上服务器,以及一个运维部门,为了保障产品的稳定,我们要求当服务器运行异常的时候自动向运维部门每个相关负责人发送邮件或短信报警。
在这个例子里,服务器就相当于被观察者,而运维负责人都是观察者,
那么我们通过代码来说明吧:
//运行的服务
class Server{
private $_watcher;//观察者列表
//添加一个观察者
function attachWatcher(Watcher $watcher){
$this->_watcher[] = $watcher;
}
function run(){
//.....假设发生异常
$this->notify();
}
function notify(){
//通知观察者“出事了”
foreach($this->_watcher as $watcher){
$watcher->update();
}
exit;//中断程序或者跳过错误等其他逻辑
}
}
//观察者接口
abstract class Watcher {
public function update();
}
//观察者A
class WatcherA extends Watcher {
function update() {
//发送短信到手机
}
}
//观察者B
class WatcherB extends Watcher {
function update() {
//发送邮件通知
}
}
$server = new Server();
$server->attachWatcher(new WatcherA());//添加一个观察者A(运维A)
$server->attachWatcher(new WatcherB());//添加一个观察者B(运维B)
$server->run();//启动服务
代码比较简单,只是说明一下机制。
等等,这怎么跟我们平时所接触的"事件机制"很像?我觉得事件机制就是对观察者模式的进一步扩展。