第十四章 老板回来,我不知道 --- 观察者模式

  1. <?php
  2. abstract class Subject
  3. {
  4. private $observers = [];
  5. public function attach(Observer $observer)
  6. {
  7. array_push($this->observers, $observer);
  8. }
  9. public function detatch($observer)
  10. {
  11. foreach ($this->observers as $key => $value) {
  12. if ($observer === $value) {
  13. unset($this->observers[$key]);
  14. }
  15. }
  16. }
  17. public function notify()
  18. {
  19. foreach ($this->observers as $observer) {
  20. $observer->update();
  21. }
  22. }
  23. }
  24. abstract class Observer
  25. {
  26. abstract function update();
  27. }
  28. class ConcreteSubject extends Subject
  29. {
  30. private $subjectState;
  31. public function setState($state)
  32. {
  33. $this->subjectState = $state;
  34. }
  35. public function getState()
  36. {
  37. return $this->subjectState;
  38. }
  39. }
  40. class ConcreteObserver extends Observer
  41. {
  42. private $name;
  43. private $subject;
  44. function __construct(ConcreteSubject $subject, $name)
  45. {
  46. $this->subject = $subject;
  47. $this->name = $name;
  48. }
  49. public function update()
  50. {
  51. echo "观察者 ".$this->name."的新状态是:".$this->subject->getState()."\n";
  52. }
  53. }
  54. $s = new ConcreteSubject();
  55. $s->attach(new ConcreteObserver($s, "x"));
  56. $s->attach(new ConcreteObserver($s, "y"));
  57. $z = new ConcreteObserver($s, "z");
  58. $s->attach($z);
  59. $s->detatch($z);
  60. $s->setState('ABC');
  61. $s->notify();

总结:

观察者模式,定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

将一个系统分割成一系列相互协作的类有一个很不好的副作用,那就是要维护相关对象间的一致性。我们不希望为了维持一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不便。

观察者模式所做的工作其实就是在接触耦合。让耦合的双方都依赖于抽象,而不是依赖于具体。从而使得各自的变化都不会影响另一边的变化。

上一章:第十三章 好菜每回味不同 --- 建造者模式

下一章:第十五章 就不能不换DB吗? --- 抽象工厂模式