六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 851|回复: 0

php设计模式 Observer(观察者模式)

[复制链接]
 楼主| 发表于 2013-8-1 15:16:30 | 显示全部楼层 |阅读模式
  1. <?php
  2. /**
  3. * 观察者模式
  4. *
  5. * 定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新
  6. * 能够便利地创建查看目标对象状态的对象,并且提供与核心对象非耦合的指定功能
  7. * 插件系统
  8. */
  9. class Observerable
  10. {
  11. private$_observers=array();

  12. publicfunction registerObserver($observer)
  13.     {
  14. $this->_observers[] =$observer;
  15.     }

  16. publicfunction removeObserver($observer)
  17.     {
  18. $key=array_search($observer,$this->_observers);
  19. if(!($key===false))
  20.         {
  21. unset($this->_observers[$key]);
  22.         }
  23.     }

  24. publicfunction notifyObservers()
  25.     {
  26. foreach($this->_observers as$observer)
  27.         {
  28. if($observer instanceof Observer) $observer->update($this);
  29.         }
  30.     }
  31. }

  32. interface Observer
  33. {
  34. publicfunction update($observer);
  35. }

  36. interface DisplayElement
  37. {
  38. publicfunction display();
  39. }

  40. // -- 实例类定义
  41. class NewsObserverable extends Observerable
  42. {
  43. private$_sports_news;
  44. publicfunction setSportsNews($data)
  45.     {
  46. $this->_sports_news =$data;
  47. $this->notifyObservers();
  48.     }

  49. publicfunction getSportsNews()
  50.     {
  51. return$this->_sports_news;
  52.     }

  53. private$_local_news;
  54. publicfunction setLocalNews($data)
  55.     {
  56. $this->_local_news =$data;
  57. $this->notifyObservers();
  58.     }

  59. publicfunction getLocalNews()
  60.     {
  61. return$this->_local_news;
  62.     }
  63. }

  64. class SportsNews implements Observer,DisplayElement
  65. {
  66. private$_data=null;
  67. publicfunction update($observer)
  68.     {
  69. if($this->_data !=$observer->getSportsNews())
  70.         {
  71. $this->_data =$observer->getSportsNews();
  72. $this->display();
  73.         }
  74.     }

  75. publicfunction display()
  76.     {
  77. echo$this->_data.date("Y-m-d H:i:s")."
  78. ";
  79.     }
  80. }

  81. class LocalNews implements Observer,DisplayElement
  82. {
  83. private$_data=null;
  84. publicfunction update($observer)
  85.     {
  86. if($this->_data !=$observer->getLocalNews())
  87.         {
  88. $this->_data =$observer->getLocalNews();
  89. $this->display();
  90.         }
  91.     }

  92. publicfunction display()
  93.     {
  94. echo$this->_data.date("Y-m-d H:i:s")."
  95. ";
  96.     }
  97. }

  98. // -- 实例化 ---

  99. $objObserver=new NewsObserverable();
  100. $local=new LocalNews();
  101. $sports=new SportsNews();

  102. $objObserver->registerObserver($local);
  103. $objObserver->registerObserver($sports);

  104. $objObserver->setSportsNews("sports news 1 ");
  105. $objObserver->setLocalNews("local news 1 ");
  106. $objObserver->removeObserver($sports);
  107. $objObserver->setLocalNews("local news 2 ");
  108. $objObserver->setSportsNews("sports news 2 ");
  109. $objObserver->removeObserver($local);
  110. $objObserver->setLocalNews("local news 3 ");
复制代码
本文摘自:http://www.cnblogs.com/bluefrog/archive/2011/06/14/2080208.html

该会员没有填写今日想说内容.
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表