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

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

    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吗? --- 抽象工厂模式