日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

PHP設計模式中觀察者模式講解

瀏覽:468日期:2022-06-06 08:11:46
目錄
  • 簡介
  • 適用場景
  • 優點
  • 缺點
  • 補充
  • 代碼(自定義實現)
  • 代碼(基于SPL實現)

簡介

觀察者模式是行為型模式的一種,定義了對象間一對多的關系。當對象的狀態發生變化時候,依賴于它的對象會得到通知。

適用場景

  • 類似觸發鉤子事件,可做消息通知、框架底層監聽。
  • 一個對象的改變會導致一個或多個對象發生改變,方便擴展的寫法。

優點

方便擴展,降低耦合,統一觸發規則。當需要新增或者刪除一個觀察者的時候,只需要增加觀察者就行。

缺點

  • 相比于不用觀察者而是直接依賴某些類,增加代碼的復雜度。
  • 如果觀察者者被觀察者互相依賴,有產生死循環的可能。

補充

  • 需要理清楚觀察者和被觀察者是誰,觀察者可以理解為被動受到通知的對象。被觀察者是主動發送通知的對象。
  • 固定的套路,被觀察者至少需要一個添加觀察者的方法和一個通知觀察者的方法用來確定身份和發送通知(一般有三個,多一個刪除觀察者的方法),觀察者至少需要一個更新的方法用于接收被觀察者的通知。

代碼(自定義實現)

//假設用戶成功購買商品后需要發送郵件和短信通知
class Order {
    private $observers = [];
    //添加觀察者
    public function attach($type, $observer) {
$this->observers[$type] = $observer;
    }
    //對每個觀察者進行通知
    public function notify() {
if ($this->observers == []) {
    return null;
}
foreach ($this->observers as $every_observer) {
    (new $every_observer)->update($this);
}
    }
    //購買商品,觸發通知
    public function buyGoods() {
//todo 訂單操作
echo "商品購買完成" . PHP_EOL;
$this->notify();
    }
}
class Mail {
    public function update($observer) {
echo "發送電子郵件" . PHP_EOL;
    }
}
class Sms {
    public function update($observer) {
echo "發送短信" . PHP_EOL;
    }
}
$order = new Order();
//添加觀察者
$order->attach("mail", Mail::class);
$order->attach("sms", Sms::class);
$order->buyGoods();

代碼(基于SPL實現)

SPL(Standard PHP Library)標準PHP類庫,用于解決典型問題的一組接口與類的集合。

class OrderListener implements \SplSubject {
    //觀察者列表
    public $observers;
    public function __construct() {
//SplObjectStorage類提供從對象到數據的映射,或者通過忽略數據,提供對象集的映射。在許多需要唯一標識對象的情況下,這種雙重用途非常有用。
$this->observers = new \SplObjectStorage();
    }
    //添加要通知的對象
    public function attach(\SplObserver $observer) {
$this->observers->attach($observer);
    }
    //移除要通知的對象
    public function detach(\SplObserver $observer) {
$this->observers->detach($observer);
    }
    //通知
    public function notify() {
//將迭代器(此處可以理解為指針)倒回到第一個存儲元素。
$this->observers->rewind();
//判斷指針是否有效
while($this->observers->valid()) {
    //獲取當前的觀察者
    $curr_obj = $this->observers->current();
    //對當前觀察者進行通知
    $curr_obj->update($this);
    //向下移動指針
    $this->observers->next();
}
    }
    //觸發通知
    public function buyGoods() {
echo "購買成功" . PHP_EOL;
$this->notify();
    }
}
//SplObserver接口與SplSubject接口一起使用,以實現觀察者設計模式。
class Mail implements \SplObserver {
    //對被觀察的對象做相應的處理
    public function update(\SplSubject $subject) {
echo "發送郵件" . PHP_EOL;
    }
}
class Sms implements \SplObserver {
    //對被觀察的對象做相應的處理
    public function update(\SplSubject $subject) {
echo "發送短信" . PHP_EOL;
    }
}
$listener = new OrderListener();
//添加觀察者
$listener->attach(new Mail());
$listener->attach(new Sms());
$listener->buyGoods();

通知代碼(基于SPL實現的notify方法優化)

	//以上代碼的notify方法使用原生手動調整指針的方式去實現。也可以使用foreach去遍歷實現
    public function notify() {
foreach ($this->observers as $observer) {
    $observer->update($this);
}
    }

到此這篇關于PHP設計模式中觀察者模式講解的文章就介紹到這了,更多相關PHP觀察者模式內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!

標簽: PHP
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品老牛| 国产精品xxxav免费视频| 欧美女激情福利| 电影91久久久| 国产精品宾馆| 国产探花在线精品| 亚洲二区在线| 亚洲精品a级片| 国产亚洲精品自拍| 免费精品视频在线| 亚洲精品护士| a日韩av网址| 99久久亚洲精品蜜臀| 国产 日韩 欧美一区| 欧美激情在线精品一区二区三区| 久久蜜桃av| 欧美成a人片免费观看久久五月天| 另类小说一区二区三区| 国产劲爆久久| 欧美日韩夜夜| 亚洲毛片在线| 亚洲精品人人| 国产亚洲精品精品国产亚洲综合 | 国产欧洲在线| 国产aa精品| 精品国产黄a∨片高清在线| 国产精品v日韩精品v欧美精品网站 | 鲁大师成人一区二区三区| 国产精品欧美在线观看| 激情欧美亚洲| 在线精品视频在线观看高清| 激情久久一区二区| 国模精品一区| 成人国产精品一区二区网站| 日韩国产综合| yellow在线观看网址| 桃色一区二区| 亚洲深夜福利在线观看| 成人va天堂| 成午夜精品一区二区三区软件| 欧美日韩精品一区二区三区在线观看| 亚洲黄色免费av| 国产精品久久久久久久久久白浆| 在线手机中文字幕| 欧美成人国产| 蜜臀va亚洲va欧美va天堂| 国产精品久久久久久久久妇女| 中文字幕人成乱码在线观看| 亚洲五月综合| 亚洲精品护士| 青草国产精品久久久久久| 在线 亚洲欧美在线综合一区| 人人草在线视频| 欧美亚洲国产一区| 私拍精品福利视频在线一区| 久久一区亚洲| 成人在线视频免费看| 国产精品成久久久久| 精品一区二区三区免费看| 激情婷婷综合| 亚洲精品一级| 国产精品一区高清| 国产激情精品一区二区三区| 精品三级国产| 亚洲www啪成人一区二区| 亚洲美女久久| 国产精品99一区二区三| 成人日韩av| 日本伊人午夜精品| 日韩深夜视频| 国产精品一区二区三区av麻| 久久人人88| 在线亚洲精品| 成人黄色av| 亚洲欧洲另类| 国产精品一国产精品| 一二三区精品| 日韩视频1区| 天堂网av成人| 免费成人在线视频观看| 免费看一区二区三区| 99国产一区| 日韩超碰人人爽人人做人人添| 你懂的网址国产 欧美| 久久永久免费| 99在线|亚洲一区二区| 蜜桃av一区二区| 国产丝袜一区| 久久精品在线| 欧美jjzz| 国产亚洲人成a在线v网站 | 国产精品久久久久av蜜臀| 日韩在线短视频| 日本天堂一区| 亚洲免费影视| 国产精品伦一区二区| 一区在线视频观看| 国产毛片精品| 成人影视亚洲图片在线| 综合国产精品| 亚洲天堂成人| 欧美日本不卡| 成人国产精品久久| 青草综合视频| 日韩精品看片| 国产精品亚洲片在线播放| 香蕉国产精品| 中文精品视频| 欧美精品一线| 国产情侣一区在线| 国产精品腿扒开做爽爽爽挤奶网站| 久久精品免费一区二区三区| 少妇精品在线| 午夜久久黄色| 一区二区三区四区日本视频| 亚洲精品亚洲人成在线观看| 国产日韩高清一区二区三区在线| 日韩不卡在线| 欧美韩一区二区| 成人台湾亚洲精品一区二区| 国产精品久一| 国际精品欧美精品| 国产精品7m凸凹视频分类| 国产精品嫩草99av在线| 欧美偷窥清纯综合图区| 日韩不卡一区二区| 国产精品嫩模av在线| 亚洲精品乱码久久久久久蜜桃麻豆 | 日韩精品影视| 不卡福利视频| 精品一区二区三区的国产在线观看 | 综合欧美亚洲| 热久久国产精品| 欧美综合国产| 欧美亚洲自偷自偷| 欧美日韩一区二区综合| 免费在线成人| 久久亚洲资源中文字| 久久中文字幕av一区二区不卡| 亚洲一区观看| 亚洲精品九九| 国产精品嫩草99av在线| 欧美一区免费| 国产理论在线| 日韩国产欧美一区二区| 国产剧情一区二区在线观看| 精品视频高潮| 欧美日韩黑人| 免费日韩av片| 亚洲女同中文字幕| 久久精品99国产精品| 精品中文字幕一区二区三区 | 日韩三级一区| 波多野结衣久久精品| 久久av资源| 国产精品亚洲一区二区三区在线观看| 国产精品一区免费在线| 日韩免费高清| 国产亚洲观看| 免费人成网站在线观看欧美高清| 成人国产精品久久| 国产一区一一区高清不卡| 精品国产美女a久久9999| 精品欧美日韩精品| 久久精品欧洲| 亚洲午夜精品久久久久久app| 久久精选视频| 国产色噜噜噜91在线精品| 日韩一级精品| 日韩欧美中文在线观看| 国产aⅴ精品一区二区四区| 99精品美女| 国产精品**亚洲精品| 69堂精品视频在线播放| 国产精品入口久久| 精品国产美女a久久9999| 亚洲精品在线观看91| 欧美日韩国产传媒| 美女毛片一区二区三区四区最新中文字幕亚洲| 亚洲三级av| 久久视频一区| 欧美精品一线| 午夜影院欧美| 精品国产一区二| 一区在线免费| 久久精品国产成人一区二区三区| 青草av.久久免费一区| 欧美极品中文字幕| 亚洲ww精品| 亚洲精品一级二级| 日韩高清不卡在线| 在线精品福利| 亚洲精品网址| 中文字幕在线免费观看视频| 美日韩一区二区三区| 国产乱码精品一区二区亚洲| 国产精品久久久久久久久免费高清 | 日韩专区视频网站| 国产精品入口久久| 久久都是精品|