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


發佈了40 篇原創文章 · 獲贊 0 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章