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

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

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

瀏覽:324日期:2022-06-06 10:57:55
目錄
  • 簡介
  • 適用場景
  • 缺點
  • 補充
  • 代碼(自定義實現)

簡介

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

適用場景

類似觸發鉤子事件,可做消息通知、框架底層監聽。

一個對象的改變會導致一個或多個對象發生改變,方便擴展的寫法。

優點

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

缺點

相比于不用觀察者而是直接依賴某些類,增加代碼的復雜度。

如果觀察者者被觀察者互相依賴,有產生死循環的可能。

補充

需要理清楚觀察者和被觀察者是誰,觀察者可以理解為被動受到通知的對象。被觀察者是主動發送通知的對象。

固定的套路,被觀察者至少需要一個添加觀察者的方法和一個通知觀察者的方法用來確定身份和發送通知(一般有三個,多一個刪除觀察者的方法),觀察者至少需要一個更新的方法用于接收被觀察者的通知。

代碼(自定義實現)

//假設用戶成功購買商品后需要發送郵件和短信通知
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久久,三上悠亚国产精品一区二区三区
美女毛片一区二区三区四区 | 欧美精品不卡| 日韩精品久久理论片| 亚洲欧洲专区| 欧美一区网站| 欧美aⅴ一区二区三区视频| 精品九九在线| 日韩精品免费一区二区三区| 日本在线高清| 午夜久久黄色| 日韩欧美中文在线观看| 国产精品久久久久久久久久久久久久久 | 中文字幕一区二区精品区| 久久亚洲精品伦理| 欧美视频二区| 亚洲综合在线电影| 日韩中文字幕不卡| 国产一卡不卡| www.九色在线| 石原莉奈在线亚洲二区| 日韩av一级片| 久久久久久一区二区| 午夜久久99| 国产欧美亚洲精品a| 国产一区二区三区不卡av| 久久久777| 日本在线观看不卡视频| 精品久久电影| 成人av动漫在线观看| 四虎精品一区二区免费| 欧美极品中文字幕| 不卡中文一二三区| 国产精品免费大片| 1000部精品久久久久久久久| 亚洲精品第一| 日韩在线二区| 日韩中文一区二区| 国产传媒在线观看| 一区在线视频观看| 国产精品调教| 激情欧美一区二区三区| 婷婷五月色综合香五月| 亚洲天堂av影院| 999在线观看精品免费不卡网站| 国产精品尤物| 丝袜美腿高跟呻吟高潮一区| 国产一区二区三区亚洲综合| 亚洲男人在线| 欧美日韩在线观看视频小说| 国产精品一区二区三区四区在线观看| 欧美99久久| 成人在线视频区| 亚洲精品乱码久久久久久蜜桃麻豆| 午夜精品成人av| 91大神在线观看线路一区| 成人久久一区| 你懂的亚洲视频| 亚洲综合精品四区| 麻豆91小视频| 亚洲精品婷婷| 欧美女激情福利| 波多视频一区| 麻豆精品av| 欧美啪啪一区| 亚洲欧美久久精品| 欧美在线亚洲| 成人精品动漫一区二区三区| 日韩高清不卡在线| 亚洲一区观看| 136国产福利精品导航网址| 麻豆成人av在线| 午夜久久av| 亚洲综合不卡| 成人羞羞在线观看网站| 久久不卡日韩美女| 日本欧美一区二区| 亚洲永久字幕| 99国产精品久久久久久久| 亚洲www啪成人一区二区| 精品美女视频| 美日韩一区二区三区| 91成人在线| 久久国产婷婷国产香蕉| 日本成人中文字幕在线视频| 男女激情视频一区| 亚洲精品在线观看91| 99精品在线| 999精品在线| 成人三级高清视频在线看| 国产精品成人3p一区二区三区| 视频国产精品| 青草久久视频| 国产区精品区| 国产乱子精品一区二区在线观看| 日本亚洲欧洲无免费码在线| 亚洲精品国模| 日韩av网站在线观看| 欧美片第1页综合| 欧美在线看片| 国产精品美女久久久久久不卡| 国产精品.xx视频.xxtv| 国产精品**亚洲精品| 麻豆精品视频在线观看| 欧美精品二区| 精品美女视频 | 亚洲精品免费观看| 少妇精品久久久一区二区三区| 亚洲一区二区日韩| 亚洲五月综合| 欧美在线首页| 久久三级中文| 日韩欧美1区| 免费视频一区三区| 国产精品日本| 日本亚洲不卡| 国产视频一区二| 狠狠久久伊人| 欧美亚洲在线日韩| 久久不射中文字幕| 亚洲一区二区三区久久久| 日韩精品导航| 麻豆国产欧美一区二区三区| 福利在线免费视频| 欧美99久久| 亚洲精品伦理| 精品欠久久久中文字幕加勒比| 亚洲播播91| 一区二区国产在线| 国产欧美在线| 欧美日韩精品免费观看视完整| 蜜桃tv一区二区三区| 色综合视频一区二区三区日韩 | 香蕉成人久久| 国产午夜精品一区在线观看| 国产不卡精品| 99国产精品视频免费观看一公开 | 日韩精品一卡| 日韩精品视频一区二区三区| 精品一区二区三区中文字幕视频 | 国产精品任我爽爆在线播放| 97精品国产| 久久xxxx精品视频| 国产欧美在线观看免费| 日韩在线中文| 亚洲香蕉视频| 国产一区国产二区国产三区| 伊人成人网在线看| 日韩在线网址| 97se综合| 日韩动漫一区| av中文字幕在线观看第一页| 老司机精品久久| 精品色999| 黄色日韩在线| 国产日本精品| 四虎影视精品| 国产精品超碰| 国产一区成人| 精品国产欧美| 亚洲精品九九| 精品视频一区二区三区四区五区 | 日韩在线黄色| 99精品小视频| 国产精品毛片视频| 国产精品老牛| 日韩av在线播放网址| 一区二区国产在线| 日韩精品永久网址| 日韩激情综合| 国产偷自视频区视频一区二区| 欧美黑人巨大videos精品| 亚洲男女自偷自拍| 国产一区二区三区久久久久久久久| 久久av一区二区三区| 黄色在线网站噜噜噜| 日韩三级久久| 丝袜国产日韩另类美女| 欧美国产一级| 国产精品亚洲成在人线| 美女精品在线| 日韩欧美一区二区三区在线视频| 18国产精品| 久久99伊人| 99久久精品网| 岛国av在线网站| 久久免费精品| 7777精品| 亚洲精品欧美| 激情婷婷亚洲| 国产精品久久久久久久久久10秀| 国产亚洲一区二区三区啪| 中文精品视频| 亚洲性图久久| 夜鲁夜鲁夜鲁视频在线播放| 美女毛片一区二区三区四区最新中文字幕亚洲 | 在线亚洲观看| 五月天综合网站| 91欧美日韩| 国产精品嫩模av在线| 深夜福利亚洲|