觀察者模式

<?php
/**
 * @author  v.r  And  
 * 
 * @example
 * 觀察者模式
 * 觀察者設計模式可以更便利的建立查看目標對象狀態,而且提供與核心對象非耦合的指定功能
 * 
 * 解決問題
 * 軟件應用回不斷要求添加新功能。 如何在沒必要徹底重構某些核心對象的狀況下向應用程序添加額外的功能呢?
 * 
 * (消息通知,插件系統,緩存器構建)
 * 
 *  電商購買流->購買成功->商品出庫->商品貨運中
 *  活動流構建
 * @copyright copyright information
 * 
 */


class CD 
{
    public $band = '';
    public $title = '';
    protected $observers =  array();

    public function __construct($title,$band)
    {
        $this->title = $title;
        $this->band = $band;
        # code...
    }
    
    public function attachObserver($type,$observer)
    {
        $this->observers[$type][] = $observer; 
        # code...
    }

    public function notifyObserver($type)
    {
        if (isset($this->observers[$type])) {
            foreach ($this->observers[$type] as $observer) {
                # code...
                $observer->update($this);
            }
            # code...
        }
        # code...
    }

    public function buy()
    {
        # code...
        # 
        $this->notifyObserver('purchased');
    }


    public function outStorage() {
        $this->notifyObserver('outStorage');
    }

}

//購買通知流觀察者
class buyCDNotifyStreamObserver
{
    
    public function update(CD $cd)
    {   #能夠作邏輯判斷作一些信息處理
        $activity = "This CD named {$cd->title} by";
        $activity .="{$cd->band} was just purchased, ";
        ActivityStream :: addNewItem($activity);
        # code...
    }
}

//通知流
class ActivityStream
{
    
    public static function addNewItem($item)
    {   
        print "\n".$item;
        # code...
    }
}

$title = 'Waste of a Rib';
$band = 'Naver Again';
$cd  = new CD($title,$band);
$observer = new buyCDNotifyStreamObserver();
$cd->attachObserver('purchased',$observer);
$cd->buy(); //購買


$cd->attachObserver('outStorage',$observer);
$cd->outStorage();



#end script
相關文章
相關標籤/搜索