1. <?php
  2. //php设计模式观察者模式
  3.  
  4. /**
  5. 被观察者
  6. */

  7. class user implements SplSubject{
  8. public $lognum;
  9. public $hobby;
  10.  
  11. protected $observers=null;
  12. public function __construct($hobby){
  13. $this->lognum=rand(1,10);
  14. $this->hobby=$hobby;
  15. $this->observers=new SplObjectStorage();
  16. }
  17. public function login(){
  18. $this->notify();
  19. }
  20. public function attach(SplObserver $observer){
  21. $this->observers->attach($observer);
  22. }
  23. public function detach(SplObserver $observer){
  24.  
  25. $this->observers->detach($observer);
  26. }
  27.  
  28. public function notify(){
  29. $this->observers->rewind();
  30. while($this->observers->valid()){
  31. $observer=$this->observers->current();
  32. $observer->update($this);
  33. $this->observers->next();
  34. }
  35. }
  36. }
  37. /**
  38. * 观察者
  39. */
  40. class secrity implements SplObserver{
  41. public function update(SplSubject $subject){
  42. if($subject->lognum<3){
  43. echo '这是第'.$subject->lognum.'次安全登录';
  44. }else{
  45. echo '这是第'.$subject->lognum.'次登录,异常';
  46. }
  47. }
  48. }
  49. class ad implements SplObserver{
  50. public function update(SplSubject $subject){
  51. if($subject->hobby=='sports'){
  52. echo '台球英锦赛门票预订';
  53. }else{
  54. echo '好好学习天天向上';
  55. }
  56. }
  57. }
  58. //实施观察
  59. $user=new user('study');
  60. $user->attach(new secrity());
  61. $user->attach(new ad());
  62. $user->login();
  63.  
  64. ?>

观察者模式属于行为模式,是定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依 赖于它的对象都得到通知并自动刷新。它完美的将观察者对象和被观察者对象分离。可以在独立的对象(主体)中维护一个对主体感兴趣的依赖项(观察器)列表。 让所有观察器各自实现公共的 Observer 接口,以取消主体和依赖性对象之间的直接依赖关系。

实例Ⅱ

  1. class MySubject implements SplSubject {
  2. private $_observers;
  3. private $_name;
  4.  
  5. public function __construct($name) {
  6. $this->_observers = new SplObjectStorage();
  7. $this->_name = $name;
  8. }
  9.  
  10. public function attach(SplObserver $observer) {
  11. $this->_observers->attach($observer);
  12. }
  13.  
  14. public function detach(SplObserver $observer) {
  15. $this->_observers->detach($observer);
  16. }
  17.  
  18. public function notify() {
  19. foreach ($this->_observers as $observer) {
  20. $observer->update($this);
  21. }
  22. }
  23.  
  24. public function getName() {
  25. return $this->_name;
  26. }
  27. }
  28. class MyObserver1 implements SplObserver {
  29. public function update(SplSubject $subject) {
  30. echo __CLASS__ . ' - ' . $subject->getName();
  31. }
  32. }
  33.  
  34. class MyObserver2 implements SplObserver {
  35. public function update(SplSubject $subject) {
  36. echo __CLASS__ . ' - ' . $subject->getName();
  37. }
  38. }
  39. $observer1 = new MyObserver1();
  40. $observer2 = new MyObserver2();
  41.  
  42. $subject = new MySubject("test");
  43.  
  44. $subject->attach($observer1);
  45. $subject->attach($observer2);
    $subject->notify(); 

PHP实现观察者模式的更多相关文章

  1. 23种设计模式--观察者模式-Observer Pattern

    一.观察者模式的介绍      观察者模式从字面的意思上理解,肯定有两个对象一个是观察者,另外一个是被观察者,观察者模式就是当被观察者发生改变得时候发送通知给观察者,当然这个观察者可以是多个对象,在项 ...

  2. 谈谈JS的观察者模式(自定义事件)

    呼呼...前不久参加了一个笔试,里面有一到JS编程题,当时看着题目就蒙圈...后来研究了一下,原来就是所谓的观察者模式.就记下来...^_^ 题目 [附加题] 请实现下面的自定义事件 Event 对象 ...

  3. ObserverPattern(观察者模式)

    import java.util.ArrayList; import java.util.List; /** * 观察者模式 * @author TMAC-J * 牵一发而动全身来形容观察者模式在合适 ...

  4. java观察者模式

      像activeMQ等消息队列中,我们经常会使用发布订阅模式,但是你有没有想过,客户端时如何及时得到订阅的主题的信息?其实就里就用到了观察者模式.在软件系统中,当一个对象的行为依赖于另一个对象的状态 ...

  5. Backbone源码解析(六):观察者模式应用

    卤煮在大概一年前写过backbone的源码分析,里面讲的是对一些backbone框架的方法的讲解.这几天重新看了几遍backbone的源码,才发现之前对于它的理解不够深入,只关注了它的一些部分的细节和 ...

  6. PHP 高级编程(3/5) - 使用SPL(标准PHP库)实现观察者模式

    SPL(标准PHP库 - Standard PHP Library)是PHP5面向对象功能中重要的部分.原文解释是这样的“The Standard PHP Library (SPL) is a col ...

  7. 设计模式--观察者模式初探和java Observable模式

    初步认识观察者模式 观察者模式又称为发布/订阅(Publish/Subscribe)模式,因此我们可以用报纸期刊的订阅来形象的说明: 报社方负责出版报纸. 你订阅了该报社的报纸,那么只要报社发布了新报 ...

  8. 学C#之设计模式系列笔记(2)观察者模式

    一.借鉴说明 1.<Head First Design Patterns>(中文名<深入浅出设计模式>) 2.维基百科,观察者模式,https://zh.wikipedia.o ...

  9. PHP 观察者模式

    观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. [观察者模式中主要角色] 1.抽象主题(Subject)角色: 抽象主题提供了增加 ...

  10. GJM: 设计模式 - 观察者模式

    GJM : 观察者模式 视频地址: http://www.imooc.com/learn/415 本课程通过一个天气预报的发布和订阅案例,来讲解观察者模式在Java项目中的应用.主要包括观察者模式的结 ...

随机推荐

  1. Putty SSH简单使用

    本地的puttygen生出的秘钥,公钥传到服务器上连接会报错 Server refused our key. 一般我们建议都在服务器上生成秘钥,把私钥下载下来.加载到putty认证中 01.在服务器上 ...

  2. Beta版本冲刺Day5

    会议讨论: 628:配置java环境已经成功,Tomcat部署也成功了,Mysql还未进行配置.601:继续修改其他的页面外观. 528:继续完成其他的功能页面. 340:对一些页面进行了优化美观,并 ...

  3. mybatis执行批量更新batch update 的方法

    1.数据库连接必须配置:&allowMultiQueries=true 我的配置如下:jdbc:mysql://10.20.13.16:3306/CALENDAR?useUnicode=tru ...

  4. PHP 解析 ElasticSearch 的 json 方法,有關遍歷所有 json 元素

    以下是eleasticsearch返回的json資料:{"took" : 12,"timed_out" : false,"_shards" ...

  5. 爱上MVC3系列~Html.BeginForm与Ajax.BeginForm

    Html.BeginForm与Ajax.BeginForm都是MVC架构中的表单元素,它们从字面上可以看到区别,即Html.BeginForm是普通的表单提交,而Ajax.BeginForm是支持异步 ...

  6. [转]PL/SQLDeveloper导入导出Oracle数据库方法

    原文地址:http://www.2cto.com/database/201405/305452.html 1.Oracle数据库导出步骤 1.1 Tools→Export User Objects.. ...

  7. Shell命令_正则表达式

    正则表达式是包含匹配,通配符是完全匹配 基础正则表达式 test.txt示例文件 1 2 3 4 5 6 7 8 9 10 11 12 Mr. James said: he was the hones ...

  8. hdu 2069 限制个数的母函数(普通型)

    Coin Change Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  9. C#-数据库访问技术 ado.net——创建 数据库连接类 与 数据库操作方法 以及简单的数据的添加、删除、修改、查看

    数据库访问技术 ado.net 将数据库中的数据,提取到内存中,展示给用户看还可以将内存中的数据写入数据库中去 并不是唯一的数据库访问技术,但是它是最底层的数据库访问技术 1.创建数据库,并设置主外键 ...

  10. 16 IO操作文件读写

    IO的分类 第一种分法: 1.输入流 2.输出流 第二种分法: 1.字节流 2.字符流 第三种分法: 1.节点流 2.处理流 I/O当中的核心类: InputStream  <--------F ...