php设计模式之观察者模式

来源:互联网 发布:淘宝用户冻结无法登陆 编辑:程序博客网 时间:2024/04/30 06:15

原理:

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

使用场景:

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

接口:


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();
0 0