国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - PHP教程 - 解析PHP觀察者模式Observer

解析PHP觀察者模式Observer

2021-11-15 15:58phpyu PHP教程

Observer,首先要有一個被觀察的角色,但它是【唯一的】。雖然"表演者"只有一個但是"觀眾"有很多,既一群"人"圍觀一個"人"。既然有無數個觀察者,那么我們需要知道都有哪一些"人"。所以我們需要一個“容器”來記錄這些"人",一

觀察者模式結構圖

解析PHP觀察者模式Observer

概念

一個"演員"(被觀察者),一群"觀眾"(觀察者),一臺"攝影機"(記錄容器)

【觀察者模式中主要角色】

1.抽象主題(Subject)角色:主題角色將所有對觀察者對象的引用保存在一個集合中,每個主題可以有任意多個觀察者。 抽象主題提供了增加和刪除觀察者對象的接口。

2.抽象觀察者(Observer)角色:為所有的具體觀察者定義一個接口,在觀察的主題發生改變時更新自己。

3.具體主題(ConcreteSubject)角色:存儲相關狀態到具體觀察者對象,當具體主題的內部狀態改變時,給所有登記過的觀察者發出通知。具體主題角色通常用一個具體子類實現。

4.具體觀察者(ConcretedObserver)角色:存儲一個具體主題對象,存儲相關狀態,實現抽象觀察者角色所要求的更新接口,以使得其自身狀態和主題的狀態保持一致。

【使用場景】

假設項目經理讓我們寫了一個登陸接口,咔咔擦擦寫完了

第二天讓我們加入統計登陸次數,然后在后面加代碼第三天讓我們判斷登陸地區,又在后面加代碼第四天讓我們在用戶登陸后推送活動,再再后面加代碼第N天,這個接口已經雜亂到沒人想維護了

我們需要讓項目保持高內聚低耦合,就可以用到觀察者模式(非必須,看需求)

【觀察者模式與其它模式】

1.【中介者模式】(Mediator):通過封裝復雜的更新語義,ChangeManager充當目標和觀察者之間的中介者。
2.【單例模式】(singleton模式):ChangeManager可使用Singleton模式來保證它是唯一的并且是可全局訪問的。

代碼示例

接口示例

?
1
2
3
4
5
6
7
8
9
// 主題接口
interface Subject{
    public function register(Observer $observer);
    public function notify();
}
// 觀察者接口
interface Observer{
    public function watch();
}

Subject就是被觀察者,Observer就是觀眾,也就是觀察者

被觀察者

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 被觀察者
class Action implements Subject{
     public $_observers=array();
     public function register(Observer $observer){
         $this->_observers[]=$observer;
     }
 
     public function notify(){
         foreach ($this->_observers as $observer) {
             $observer->watch();
         }
 
     }
 }

Action實現了被觀察者接口,他現在就是被觀察者,再定義一個$_observers數組,他就是記錄觀眾的容器了。

首先實現register方法,用它傳入一個觀察者,然后塞到數組里,再實現notify()方法,它會遍歷容器數組,執行每個觀察者的watch()方法。

觀察者

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 觀察者
class Cat implements Observer{
     public function watch(){
         echo "Cat watches TV<hr/>";
     }
 }
 class Dog implements Observer{
     public function watch(){
         echo "Dog watches TV<hr/>";
     }
 }
 class People implements Observer{
     public function watch(){
         echo "People watches TV<hr/>";
     }
 }

這里定義了三個觀察者,全都實現了Observer接口,前面的Subject會循環調用每個觀察者的watch()方法,所以我們需要實現每個觀察者的watch()方法。

調用

?
1
2
3
4
5
6
// 應用實例
$action=new Action();
$action->register(new Cat());
$action->register(new People());
$action->register(new Dog());
$action->notify();

首先new被觀察者對象,執行它的register()方法,把每個觀察者都放入容器數組,最后執行notify()方法,通知所有觀察者執行自己的方法。

PHP原生自帶的觀察者模式

PHP有自帶的觀察者模式

  • splsubject接口 - 被觀察者
  • Observer接口 - 觀察者
  • SplObjectStorage對象 - 容器

首先我們有一個用戶登錄類

?
1
2
3
4
5
6
class user{
 
  public function login()
  {
      echo '登錄完畢'
  }

讓他實現splsubject接口成為被觀察者。

  • 首先在構造函數里,讓他new SplObjectStorag()對象并賦值到屬性上方便后面調用
  • 實現attach()方法,用來注冊觀察者
  • 實現detach()方法,用來刪除觀察者
  • 實現notify()方法,用來遍歷容器,調用每個觀察者的update方法(必須是update)
  • rewind方法是容器指針重置到最開始,valid方法檢測容器是否遍歷完成并返回布爾,current方法是獲取當前的觀察者,next方法是將指針后移一位
  • 修改login()方法,在里面調用notify()來通知觀察者事件完成了
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
class user implements splsubject{
 
    protected $observer = null;
 
    public function __construct()
    {
        $this->observer = new SplObjectStorage();
    }
 
    public function login()
    {
        $this->notify();
        echo '登錄完畢';
    }
 
    public function attach(SplObserver $observer)
    {
        $this->observer->attach($observer);
    }
 
    public function detach(SplObserver $observer)
    {
        $this->observer->detach($observer);
    }
 
    public function notify()
    {
        $this->observer->rewind();
        while ($this->observer->valid())
        {
            $observer = $this->observer->current();
            $observer->update($this);
            $this->observer->next();
        }
    }
}

觀察者

每個觀察者實現SplObserver接口,并實現update()方法

?
1
2
3
4
5
6
7
8
9
10
11
12
13
class cat implements SplObserver {
 
    public function update(SplSubject $subject)
    {
        echo '小貓叫一下';
    }
}
class dog implements SplObserver {
    public function update(SplSubject $subject)
    {
        echo '小狗吼一聲';
    }
}

應用

?
1
2
3
4
5
// 實時觀察
$user = new user();
$user->attach(new cat());
$user->attach(new dog());
$user->login();

以上就是解析PHP觀察者模式(Observer)的詳細內容,更多關于PHP觀察者模式(Observer)的資料請關注服務器之家其它相關文章!

原文鏈接:https://www.cnblogs.com/phpyu/p/13526403.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 91精品国产综合久久久久 | 超碰首页 | 亚洲免费观看 | 秋霞电影院午夜伦 | 国产精品不卡一区二区三区 | 中文字幕在线一区二区三区 | 亚洲专区国产精品 | 天天干天天干天天干天天射 | 亚洲国产aⅴ成人精品无吗 久久综合久久久 | 亚洲精品中文字幕在线观看 | 精品动漫一区 | 视频一区二区三区在线观看 | 九九热这里| 99久久影院 | 久久久久国产精品免费 | 韩国精品 | 日韩欧美一区在线 | 欧美一区二区激情视频 | 91亚洲国产成人久久精品网站 | 国产精品自拍视频 | 色呦呦网站在线观看 | 亚洲一区二区三区四区的 | 亚洲卡一| 高清视频一区二区三区 | 日韩成人在线视频 | 国产日韩欧美不卡 | 久久中文字幕一区二区 | 日韩精品一区二区三区免费视频 | 午夜精品一区二区三区在线播放 | 欧美在线不卡 | 国产精品一区二区三区四区五区 | 国产特级毛片aaaaaa毛片 | 国产专区在线 | 欧美精品在线一区 | 亚洲精品日本 | 国产久精品 | 久久午夜影院 | 97精品国产 | 日韩欧美国产一区二区 | 玖玖精品 | 三级视频在线观看 |