PHP-觀察者模式

lemon_lyue發表於2020-06-11

什麼是觀察者模式

當一個物件狀態傳送改變時,依賴它的物件全部會受到通知,並自動更新。觀察者模式實現了低耦合的通知機制。

可用於通知或更新操作,進行解耦,避免在原來程式碼上修改邏輯程式碼。

觀察者模式場景

一個事件發生後,要執行一連串更新操作。傳統的方式就是在事件的程式碼後加入處理邏輯,當更新的邏輯增多之後,程式碼會變得難以維護。這種方式是耦合的,增加新的邏輯或刪除舊的邏輯需要修改事件的主體程式碼。

觀察者模式的實現


<?php

/**

 * 事件生成器

 * Class EventGenerator

 */

abstract class EventGenerator

{

    private $observes = [];// 觀察者陣列

    /**

     * 新增觀察者

     * @param Observe $observe

     */

    public function addObserve(Observe $observe)

    {

        $this->observes[] = $observe;

    }

    /**

     * 通知

     */

    public function notify()

    {

        foreach ($this->observes as $observe) {

            $observe->update();

        }

    }

}

/**

 * 觀察者介面

 * Interface Observe

 */

interface Observe

{

    public function update();

}

/**

 * 事件

 * Class User

 */

class User extends EventGenerator

{

    /**

     * 傳送通知

     */

    public function send()

    {

        echo '給使用者傳送通知...';

        $this->notify();

        echo '傳送成功!';

    }

}

/**

 * 郵件觀察者

 * Class EmailObserve

 */

class EmailObserve implements Observe

{

    public function update()

    {

        // TODO: Implement update() method.

        echo '傳送郵件...';

        // 郵件傳送邏輯...

        echo '郵件傳送成功...';

    }

}

/**

 * 簡訊觀察者

 * Class SMSObserve

 */

class SMSObserve implements Observe

{

    public function update()

    {

        // TODO: Implement update() method.

        echo '傳送簡訊...';

        // 簡訊傳送邏輯...

        echo '簡訊傳送成功...';

    }

}

$user = new User();

// 新增觀察者

$user->addObserve(new EmailObserve());

$user->addObserve(new SMSObserve());

// 傳送

$user->send();

執行結果:


E:\php_project\設計模式\Lemon_lyue>php Observe.php

給使用者傳送通知...傳送郵件...郵件傳送成功...傳送簡訊...簡訊傳送成功...傳送成功!

更多內容關注個人部落格:lemonlyue.github.io/

本作品採用《CC 協議》,轉載必須註明作者和本文連結

lemon_lyue

相關文章