1、什麼是觀察者模式?
從面向過程的角度來看,首先是觀察者向主題註冊,註冊完之後,主題再通知觀察者做出相應的操作,整個事情就完了。
從面向對象的角度來看,主題提供註冊和通知的接口,觀察者提供自身操作的接口。(這些觀察者擁有一個同一個接口。)觀察者利用主題的接口向主題註冊,而主題利用觀察者接口通知觀察者。耦合度相當之低
2、流程圖如下:
3、具體代碼實現如下(省略了通知接口)
1 <?php
2
3 // 觀察者接口, 定義觀察者具體需要執行的方法
4 interface Observer
5 {
6 public function eat();
7 }
8
9
10 class Cat implements Observer
11 {
12 public function eat()
13 {
14 echo 111;
15 }
16 }
17
18 class Dog implements Observer
19 {
20 public function eat()
21 {
22 echo 222;
23 }
24 }
25
26
27 class Action
28 {
29 // 保存所有已註冊的觀察者
30 private $obj = [];
31
32 // 添加觀察者
33 // $observer 觀察者對象
34 public function addObserver($key, Observer $mode)
35 {
36 $this->obj[$key] = $mode;
37 }
38
39 // 移除觀察者
40 public function remObserver($key)
41 {
42 unset($this->obj[$key]);
43 }
44
45 // 廣播通知已註冊的觀察者
46 public function notify()
47 {
48 foreach ($this->obj as $value) {
49 $value->eat();
50 }
51 }
52 }
53
54 $a = new Action();
55 $a->addObserver('cat', new Cat());
56 $a->addObserver('dog', new Dog());
57 $a->notify();