天天看點

php設計模式--觀察者模式

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

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

<code>&lt;?php</code>

<code>/**</code>

<code>*</code>

<code>* 被觀察者</code>

<code>*/</code>

<code>class</code> <code>Subject </code><code>implements</code> <code>SplSubject {</code>

<code>protected</code> <code>$_value</code><code>;</code>

<code>protected</code> <code>$_observers</code><code>;</code>

<code>* 構造函數</code>

<code>* @return void</code>

<code>public</code> <code>function</code> <code>__construct() {</code>

<code>$this</code><code>-&gt;_observers = </code><code>new</code> <code>SplObjectStorage();</code>

<code>}</code>

<code>* 追加觀察者</code>

<code>* @see SplSubject::attach()</code>

<code>public</code> <code>function</code> <code>attach(SplObserver </code><code>$observer</code><code>) {</code>

<code>$this</code><code>-&gt;_observers-&gt;attach(</code><code>$observer</code><code>);</code>

<code>* 抛棄觀察者</code>

<code>* @see SplSubject::detach()</code>

<code>public</code> <code>function</code> <code>detach(SplObserver </code><code>$observer</code><code>) {</code>

<code>$this</code><code>-&gt;_observers-&gt;detach(</code><code>$observer</code><code>);</code>

<code>* 通知觀察者</code>

<code>* @see SplSubject::notify()</code>

<code>public</code> <code>function</code> <code>notify() {</code>

<code>foreach</code> <code>(</code><code>$this</code><code>-&gt;_observers </code><code>as</code> <code>$observer</code><code>) {</code>

<code>$observer</code><code>-&gt;update(</code><code>$this</code><code>);</code>

<code>* 設定最新值</code>

<code>* @param mixed $value</code>

<code>* @return</code>

<code>public</code> <code>function</code> <code>setValue(</code><code>$value</code><code>) {</code>

<code>$this</code><code>-&gt;_value = </code><code>$value</code><code>;</code>

<code>$this</code><code>-&gt;notify();</code>

<code>* 擷取最後更新的值</code>

<code>* @return mixed</code>

<code>public</code> <code>function</code> <code>getValue() {</code>

<code>return</code> <code>$this</code><code>-&gt;_value;</code>

<code>* 觀察者</code>

<code>class</code> <code>Observer </code><code>implements</code> <code>SplObserver {</code>

<code>/\**</code>

<code>* @see SplObserver::update()</code>

<code>public</code> <code>function</code> <code>update(SplSubject </code><code>$subject</code><code>) {</code>

<code>echo</code> <code>'i know you '</code><code>.</code><code>$subject</code><code>-&gt;getValue();</code>

<code>header(</code><code>'Content-type:text/html;charset=utf-8'</code><code>);</code>

<code>date_default_timezone_set(</code><code>'Asia/Shanghai'</code><code>);</code>

<code>error_reporting</code><code>(E_ALL);</code>

<code>$subject</code> <code>= </code><code>new</code> <code>Subject();</code>

<code>$observer</code> <code>= </code><code>new</code> <code>Observer();</code>

<code>$subject</code><code>-&gt;attach(</code><code>$observer</code><code>);</code>

<code>$subject</code><code>-&gt;setValue(</code><code>'updated'</code><code>);</code>

本文轉自shayang8851CTO部落格,原文連結:http://blog.51cto.com/janephp/1286698,如需轉載請自行聯系原作者