91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP中怎么實現觀察者模式

發布時間:2021-06-12 18:31:54 來源:億速云 閱讀:146 作者:Leah 欄目:開發技術

PHP中怎么實現觀察者模式,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

“觀察者模式”的觀察者三個字信息量很大,玩過很多網絡游戲的童鞋們應該知道,即便是斗地主,除了玩家,還有一個角色叫“觀察者",在咱們本次文章中的觀察者模式也是如此,就是我們會有要有一個“主題”,只有有了一個主題,觀察者或者說各位看官才能搬著小板凳兒聚在一堆,來看我的文章。其次,觀察者還必須要有自己的操作,也就是說,你不能光看我的文章啊,還得自己動手,否則你聚在一堆兒沒事做也沒什么意義,白看一篇文章,浪費了時間。

從面向過程的角度來看,首先是觀察者向主題注冊,注冊完之后,主題再通知觀察者做出相應的操作,整個事情就完了。

從面向對象的角度來看,主題提供注冊和通知的接口,觀察者提供自身操作的接口,(這些觀察者擁有一個同一個接口)觀察者利用主題的接口向主題注冊,而主題利用觀察者接口通知觀察者,耦合度相當之低。

可以這么來說,就是,觀察者設計模式能夠更便利創建和查看目標對象狀態的對象,并且提供和核心對象非耦合的置頂功能性。

我們可以看到,觀察者設計模式非常常用,在一般復雜的WEB系統中,觀察者模式可以幫你減輕代碼設計的壓力,降低代碼耦合。

縣來看一個完整的場景應用:

  1. 設計一個訂單類

  2. 訂單創建完成后,會做各種動作,比如發送EMAIL,或者改變訂單狀態等等。

  3. 原始的方法,是將這些操作都寫在create函數里面

  4. 但是隨著訂單創建類的越來越龐大,這樣的操作已經無法滿足需求和快速變動

  5. 這個時候,觀察者模式出現了。

來看下代碼實例:

<?php
//觀察者設計模式能夠更便利創建和查看目標對象狀態的對象,并且提供和核心對象非耦合的置頂功能性。
//觀察者設計模式非常常用,在一般復雜的WEB系統中,觀察者模式可以幫你減輕代碼設計的壓力,降低代碼耦合。
//以一個購物流程為例子
class order {
    protected $observers = array(); // 存放觀察容器
    //觀察者新增
    public function addObServer($type, $observer) {
        $this->observers[$type][] = $observer;
    }
    //運行觀察者
    public function obServer($type) {
        if (isset($this->observers[$type])) {
            foreach ($this->observers[$type] as $obser) {
                $a = new $obser;
                $a->update($this); //公用方法
            }
        }
    }
    //下單購買流程
    public function create() {
        echo '購買成功';
        $this->obServer('buy'); // buy動作
    }
}
class orderEmail {
    public static function update($order) {
        echo '發送購買成功一個郵件';
    }
}
class orderStatus {
    public static function update($order) {
        echo '改變訂單狀態';
    }
}
$ob = new order;
$ob->addObServer('buy', 'orderEmail');
$ob->addObServer('buy', 'orderStatus');
$ob->create();

運行結果:

購買成功發送購買成功一個郵件改變訂單狀態

再來看個大點的實例:

<?php
// 主題接口
interface Subject{
  public function register(Observer $observer);
  public function notify();
}
// 觀察者接口
interface Observer{
  public function watch();
}
// 主題
class Action implements Subject{
   public $_observers=array();
   public function register(Observer $observer){
     $this->_observers[]=$observer;
   }
   public function notify(){
     foreach ($this->_observers as $observer) {
       $observer->watch();
     }
   }
 }
// 觀察者
class Cat implements Observer{
   public function watch(){
     echo "Cat watches TV<hr/>";
   }
 } 
 class Dog implements Observer{
   public function watch(){
     echo "Dog watches TV<hr/>";
   }
 } 
 class People implements Observer{
   public function watch(){
     echo "People watches TV<hr/>";
   }
 }
// 應用實例
$action=new Action();
$action->register(new Cat());
$action->register(new People());
$action->register(new Dog());
$action->notify();

運行結果:

Cat watches TV
--------------------------------------------------------------------------------
People watches TV
--------------------------------------------------------------------------------
Dog watches TV
--------------------------------------------------------------------------------

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

php
AI

巴林左旗| 武隆县| 达州市| 两当县| 青岛市| 雅江县| 同德县| 浦城县| 锡林郭勒盟| 中超| 鹿泉市| 易门县| 随州市| 进贤县| 浑源县| 新竹县| 湘乡市| 锦州市| 当阳市| 铁岭市| 涡阳县| 伊金霍洛旗| 称多县| 岫岩| 柏乡县| 仙桃市| 武冈市| 丘北县| 马尔康县| 紫阳县| 田阳县| 普格县| 山东省| 通化县| 台东市| 曲靖市| 渝中区| 北海市| 济南市| 乌鲁木齐市| 伊宁市|