php设计模式之观察者模式

原理:

这一模式允许某个类观察另一个类的状态,当被观察的类状态发生改变的时候,观察类可以收到通知并且做出相应的动作,通常情况下,一个观察者类负责观察被观察者中的一个事件

使用场景:

用户注册(验证邮件,用户信息激活),购物网站下单时邮件/短信通知等.

接口:


SplSubject 接口,它代表着被观察的对象,
其结构:
interface SplSubject
{
public function attach(SplObserver $observer);
public function detach(SplObserver $observer);
public function notify();
}
SplObserver 接口,它代表着充当观察者的对象,
其结构:
interface SplObserver
{
public function update(SplSubject $subject);
}



<?php class User implements SplSubject { var $uername=''; var $userid; var $useremail; const REGISTER=1;//注册 const RECHARGE=2;//用户充值 /*此处的作用是 *注册观察者,此数组存放观察者,不同的事件根据type去调用不同的观察者 */ public $observers = array(); //添加观察者 public function attach(SplObserver $observer, $type) { $this->observers[$type] = $observer; } //注销观察者 public function detach(SplObserver $observer, $type) { if(array_search($observer, $this->observers[$type])) { unset($this->observers[$type]); } } /*此处的作用是 *负责发送消息给观察者 */ public function notify($type) { if(!empty($this->observers[$type])) { foreach($this->observers[$type] as $observer) { $observer->update($this); } } } public function addUser($username='',$userid='',$useremail='') { //执行sql $this->username=$username; //数据库插入成功 $res = true; //调用通知观察者 $this->notify(self::REGISTER); return $res; } public function charge() { //执行sql //数据库更新成功 $res = true; //调用通知观察者 $this->notify(self::RECHARGE); return $res; } } class SendMail implements SplObserver { public function update(SplSubject $subject) { echo $subject->username; // $content="欢迎您注册".$username; // $this->sendMail($content); } public function sendMail($email, $title, $content) { //调用邮件接口,发送邮件 } } $mail=new SendMail(); $user=new User(); $user->attach($mail,1); $user->addUser("mtg",1); $user->notify(); 

你可能感兴趣的:(设计模式,观察者模式,PHP)