관찰자 모드 - 예 1

2324 단어 디자인 모드
예 설명
이 예 는 Head First 에서 말 한 기상대 의 예 에서 나 온 것 으로 기상대 의 날씨 가 변 할 때 구독 하 는 기상 관측소 가 제때에 업 데 이 트 될 수 있다.
   

/**
 *      
 * @author yaoran
 */
interface Observer
{
    public function update($temp, $dify, $pre);
}

    
/**
 *      -    
 * @author yaoran
 */
interface Subject
{
    //     
    public function registerObserver(Observer $o);
    //     
    public function removeObserver(Observer $o);
    //     
    public function notifyObserver();
}

   

include 'Subject.php';
class WeatherData implements Subject
{
    //       
    private $observers;

    private $temp;

    private $dify;

    private $pre;

    public function __construct()
    {

    }

    public function registerObserver(Observer $o)
    {
        $this->observers[] = $o;
    }

    public function removeObserver(Observer $o)
    {
        if (in_array($o, $this->observers)) {
            $key = array_search($o, $this->observers);
            unset($this->observers[$key]);
        }
    }

    public function notifyObserver()
    {
        if (count($this->observers) > 0) {
            foreach ($this->observers as $k=>$o) {
                $o->update($this->temp, $this->dify, $this->pre);
            }
        }
    }


    //             
    public function meaChanged(){
        $this->notifyObserver();
    }


    public function setMea($temp, $dify, $pre) {
        $this->temp = $temp;
        $this->dify = $dify;
        $this->pre  = $pre;

        $this->notifyObserver();
    }
}

/**
 *        
 */
interface Display
{
    public function display();
}

/**
 *        
 * @author yaoran
 */
include 'Observer.php';
include 'Display.php';
class ConditDisplay implements Observer,Display
{

    private $temp;

    private $dify;

    private $pre;

    private $weaData;

    public function __construct(Subject $weaData)
    {
        $this->weaData = $weaData;
        $weaData->registerObserver($this);
    }

    public function update($temp, $dify, $pre)
    {
        $this->temp = $temp;
        $this->dify = $dify;
        $this->display();
    }

    public function display()
    {
        echo '     :' . $this->temp . '--' . $this->dify . "\r
"; } }

좋은 웹페이지 즐겨찾기