1. <?php
    2. interface Subject
    3. {
    4. public function add(Observer $observer);
    5. public function del(Observer $observer);
    6. public function notify();
    7. }
    8. interface Observer
    9. {
    10. public function say();
    11. }
    12. class ConcreteObserver implements Observer
    13. {
    14. private $name ;
    15. public function __construct($name)
    16. {
    17. $this->name = $name;
    18. }
    19. public function say()
    20. {
    21. echo 'say '.$this->name.PHP_EOL;
    22. }
    23. }
    24. class ConcreteSubject implements Subject
    25. {
    26. private $_observer;
    27. private $notify_times = 0;
    28. public function __construct()
    29. {
    30. $this->_observer = [];
    31. }
    32. public function add(Observer $observer)
    33. {
    34. return array_push($this->_observer, $observer);
    35. }
    36. public function del(Observer $observer)
    37. {
    38. $index = array_search($observer, $this->_observer);
    39. if ($index === false || !key_exists($index, $this->_observer)) {
    40. return false;
    41. }
    42. unset($this->_observer[$index]);
    43. return true;
    44. }
    45. public function notify()
    46. {
    47. $this->notify_times++;
    48. echo "开始第 $this->notify_times 次通知".PHP_EOL;;
    49. if (!is_array($this->_observer)) return false;
    50. foreach ($this->_observer as $item) {
    51. $item->say();
    52. }
    53. return true;
    54. }
    55. }
    56. $dog = new ConcreteObserver('dog');
    57. $cat = new ConcreteObserver('cat');
    58. $subject = new ConcreteSubject();
    59. $subject->add($dog);
    60. $subject->notify();
    61. $subject->add($cat);
    62. $subject->add($cat);
    63. $subject->notify();
    64. $subject->del($cat);
    65. $subject->notify();
    66. $subject->del($dog);
    67. $subject->notify();
    68. $subject->del($cat);
    69. $subject->notify();