国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

PHP設計模式之:觀察者模式學習筆記

2024-05-04 21:49:58
字體:
來源:轉載
供稿:網友

設計模式中的觀察者模式我相信很多php開發者都不是很了解了,下面一聚教程小編來為各位整理了一篇相關的文章供各位參考。

一些面向對象的編程方式,提供了一種構建對象間復雜網絡互連的能力。當對象們連接在一起時,它們就可以相互提供服務和信息。這個模式對于大型系統項目來說應該是挺挺有用的,通俗的講,這種模式允許某個類去觀察另一個類。當一個類被改變時,觀察類就會收到通知并且做出相應的動作。

在平時的項目中還是挺有用的,比如一個用戶下了一筆訂單,下單成功后,就需要去發送短信/郵件的通知,庫存的修改,賬戶余額的修改等等很多操作。

在之后的PHP5.0起,內置的SPL標準庫中就提供了這種設計模式接口供大家使用,接下了就通過實例來學習一下。

SPL 提供了 SplSubject 和 SplObserver 接口。

SplSubject 接口提供了attach()、detach()、notify() 三個方法。而 SplObserver 接口則提供了 update()方法。

<?php

/**

 * 這一模式的概念是SplSubject類維護了一個特定狀態,當這個狀態發生變化時,它就會調用notify()方法。

 * 調用notify()方法時,所有之前使用attach()方法注冊的SplObserver實例的update方法都會被調用。

 *

 */

interface SplSubject{

    public function attach(SplObserver $observer);//注冊觀察者

    public function detach(SplObserver $observer);//釋放觀察者

    public function notify();//通知所有注冊的觀察者

}

interface SplObserver{

    public function update(SplSubject $subject);//觀察者進行更新狀態

}

?>

 

使用所提供的接口,來實現觀察者模式

<?php
/**
 *具體目標
 */
class Salary implements SplSubject {
    private $observers, $money;
    public function __construct() {
        $this->observers = array();
    }
 
    public function attach(SplObserver $observer) { //注冊觀察者
        $this->observers[] = $observer;
    }
 
    public function detach(SplObserver $observer) { //釋放觀察者
        if($idx = array_search($observer,$this->observers,true)) {
            unset($this->observers[$idx]);
        }
    }
 
    public function notify() { //通知所有觀察者
        foreach($this->observers as $observer) {
            $observer->update($this);
        }
    }
    public function payoff($money) { //發工資方法
        $this->money = $money;
        $this->notify(); //通知觀察者
    }
}
/**
 * 具體觀察者
 */
class Programmer1 implements SplObserver {
    public function update(SplSubject $subject) {
        echo 'Programmer1 發工資了!<br/>';
    }
}
class Programmer2 implements SplObserver {
    public function update(SplSubject $subject) {
        echo 'Programmer2 也發工資了!<br/>';
    }
}
 
$subject = new Salary();
$observer1 = new Programmer1();
$observer2 = new Programmer2();
//注冊觀察者
$subject->attach($observer1);
$subject->attach($observer2);
//發工資操作,發起通知
$subject->payoff('20K');
?>

通過Observer模式,把一對多對象之間的通知依賴關系的變得更為松散,大大地提高了程序的可維護性和可擴展性,也很好的符合了開放-封閉原則。東西是不錯,如何能夠更好的去使用它,仍需要多加實踐、聯系。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 三门峡市| 盐源县| 和静县| 昭平县| 庐江县| 疏勒县| 娄底市| 贵港市| 都江堰市| 海林市| 大兴区| 新宁县| 阳信县| 秭归县| 霍城县| 武乡县| 漳州市| 温州市| 东源县| 兴义市| 施甸县| 荥阳市| 阳曲县| 达州市| 乌拉特中旗| 乌鲁木齐县| 常州市| 姜堰市| 云林县| 韶关市| 昂仁县| 郧西县| 翁源县| 彭山县| 贵溪市| 定远县| 府谷县| 沅江市| 白玉县| 桦南县| 正镶白旗|