<?php
/**
* 3.1php设计模式-观测者模式
* 3.1.1概念:其实观察者模式这是一种较为容易去理解的一种模式吧,它是一种事件系统,意味
* 着这一模式允许某个类观察另一个类的状态,当被观察的类状态发生改变的时候,
* 观察类可以收到通知并且做出相应的动作;观察者模式为您提供了避免组件之间
* 紧密耦合的另一种方法
* 3.1.2关键点:
* 1.被观察者->追加观察者;->一处观察者;->满足条件时通知观察者;->观察条件
* 2.观察者 ->接受观察方法
* 3.1.3缺点:
* 3.1.4观察者模式在PHP中的应用场合:在web开发中观察者应用的方面很多
* 典型的:用户注册(验证邮件,用户信息激活),购物网站下单时邮件/短信通知等
*/
class BaseEvent {
private static $list_watch = [];
public static function add_watch($watch) {
array_push(static::$list_watch, $watch);
}
public static function del_watch($watch) {
foreach (static::$list_watch as $k=>$v) {
if ($watch == $v) {
unset(static::$list_watch[$k]);
return;
}
}
}
public static function notice_watch($msg) {
if ($lists = static::$list_watch) {
foreach ($lists as $watch) {
$watch->exec_something($msg);
}
}
}
}
interface Observer {
public function exec_something($msg);
}
class Watch1 implements Observer {
public function exec_something($msg) {
echo 'watch1'.$msg.PHP_EOL;
}
}
class Watch2 implements Observer{
public function exec_something($msg) {
echo 'watch2'.$msg.PHP_EOL;
}
}
class Watch3 implements Observer{
public function exec_something($msg) {
echo 'watch3'.$msg.PHP_EOL;
}
}
BaseEvent::add_watch($w1 = new Watch1());
BaseEvent::add_watch(new Watch2());
BaseEvent::add_watch(new Watch3());
BaseEvent::notice_watch('消息来了');
BaseEvent::del_watch($w1);
BaseEvent::notice_watch('消息来了');