PHP观察者设计模式
做项目过程中经常会遇到一种情况,写一个登陆接口,写完后客户有新需求需要增加统计登陆次数,过段时间又需要统计登陆地区,又过几天又需要登陆推送活动或者新用户奖励,这种情况就容易让代码很杂乱,此时就可以用到观察者模式。
概念:观察者,首先要有个被人观察的角色,这是唯一的,然后有多个观察者去看他,可以形容为一群人在围观一个人,有多个观众就得有个东西来记录这些观众,这时候就需要一个数组来储存所有观察者,此时已经形成一个被观察者,多个观察者和一个容器记录组成的一个组合。
代码示例:
//主题接口
interface Subject{
public function register($observer);
public function notify();
}
//观察者接口
interface Observer{
public function watch();
}
Subject是被观察者,Observer是观察者
//被观察者
class Action implements Subject{
public $_observers = array();
public function register($observer){
$this->_observers[] = $observer;
}
public function notify(){
foreach($this->_observers as $observers){
$observers->watch();
}
}
}
action 实现被观察者接口,他现在是被观察者,再定义一个$_observers数组,他就是存放观察者的容器。
首先实现register方法,用它传入一个观察者,然后塞到数组里,再实现notify()方法,他会遍历容器数组,执行每个观察者的watch()方法。
观察者
class cat implements Observer{
public function watch(){
echo ‘cat watches’;
}
}
class People implements Observer{
public function watch(){
echo ‘people’;
}
}
这里定义了两个观察者,全都实现Observer接口,前面的Subject会循环调用每个观察者的watch方法,所以需要实现每个观察者的watch方法
应用实例
$action = new Action();
$action->register(new Cat());
$action->register(new People());
$action->notify();
首先new被观察者对象,执行它的register()方法,把每个观察者都放入容器数组,最后执行notify防范,通知所有观察者执行自己的方法。
PHP原生自带的观察者模式
splsubject 接口 - 被观察者
observer接口 - 观察者
SplObjectStorage对象 - 容器
首先需要一个用户登录类
class user{
public function login(){
echo ‘login’;
}
}
然后让他实现 splsubject 接口成为被观察者。
1.首先在构造函数里,让他new SplObjectStorage()对象并赋值到属性上方便后边调用
2.实现attach()方法,用来注册观察者
3.实现detach()方法,用来删除观察者
4.实现notify()方法,用来遍历容器,调用每个观察者的update方法(必须是update)
5.rewind方法是容器指针重置到最开始,valid方法检测容器是否遍历完成并返回布尔,current方法获取当前的观察者,next方法是将指针后移以为
6.修改login()方法,在里边调用notify()来通知观察者事件完成
代码:
class user implements splsubject{
protected $observer = null;
public function __construct(){
$this->observer = new SplObjectStorage();
}
public function login(){
$this->notify();
echo ‘login’;
}
public function attach($observer){
$this->observer->attach($obserber);
}
public function detach($observer){
$this->observer->detach($observer);
}
public function notify(){
$this->observer->rewind();
while($this->observer->valid()){
$observer = $this->observer->current();
$observer = update($this);
$this->observer->next();
}
}
}
观察者
每个观察者实现SplObserver接口,并实现update() 方法
class cat implements splobserver{
public function update($subject){
echo ‘aaaa’;
}
}
class People implements splobserver{
public function update($subject){
echo ‘bbbb;
}
}
应用
//实时观察
$user = new user();
$user->attach(new cat());
$user->attach(new people());
$user->login();
关于PHP观察者设计模式的解释讲到这里也已经讲完了,这些是我们在实际的项目开发当中遇到问题以及解决方案,以后我们也会定期在这里分享这些内容;
如果你觉得笔者写的不错,并且具有APP开发、软件开发需求的话,也可以扫码添加好友,沟通你的想法!