php模式设计之观察者模式应用实例分析

本文实例讲述了php模式设计之观察者模式。分享给大家供大家参考,具体如下:

这是我写的《php模式设计》的第五篇。前面的四篇在不断学习不断加深认识,到了今天再看观察者模式,觉得非常容易理解。这也许就是我们积少成多的结果吧。希望还是能够不断进步。

开篇还是从名字说起,“观察者模式”的观察者三个字信息量很大。玩过很多网络游戏的童鞋们应该知道,即便是斗地主,除了玩家,还有一个角色叫“观察者"。在我们今天他谈论的模式设计中,观察者也是如此。首先,要有一个“主题”。只有有了一个主题,观察者才能搬着小板凳儿聚在一堆。其次,观察者还必须要有自己的操作。否则你聚在一堆儿没事做也没什么意义。

从面向过程的角度来看,首先是观察者向主题注册,注册完之后,主题再通知观察者做出相应的操作,整个事情就完了。

从面向对象的角度来看,主题提供注册和通知的接口,观察者提供自身操作的接口。(这些观察者拥有一个同一个接口。)观察者利用主题的接口向主题注册,而主题利用观察者接口通知观察者。耦合度相当之低。

如何实现观察者注册?通过前面的注册者模式很容易给我们提供思路,把这些对象加到一棵注册树上就好了嘛。如何通知?这就更简单了,对注册树进行遍历,让每个对象实现其接口提供的操作。

<?php
// 主题接口
interface Subject{
  public function register(Observer $observer);
  public function notify();
}
// 观察者接口
interface Observer{
  public function watch();
}
// 主题
class Action implements Subject{
   public $_observers=array();
   public function register(Observer $observer){
     $this->_observers[]=$observer;
   }
   public function notify(){
     foreach ($this->_observers as $observer) {
       $observer->watch();
     }
   }
 }
// 观察者
class Cat implements Observer{
   public function watch(){
     echo "Cat watches TV<hr/>";
   }
 }
 class Dog implements Observer{
   public function watch(){
     echo "Dog watches TV<hr/>";
   }
 }
 class People implements Observer{
   public function watch(){
     echo "People watches TV<hr/>";
   }
 }
// 应用实例
$action=new Action();
$action->register(new Cat());
$action->register(new People());
$action->register(new Dog());
$action->notify();

运行结果:

Cat watches TV
--------------------------------------------------------------------------------
People watches TV
--------------------------------------------------------------------------------
Dog watches TV
--------------------------------------------------------------------------------

所谓模式,更多的是一种想法,完全没必要拘泥于代码细节。观察者模式更多体现了两个独立的类利用接口完成一件本应该很复杂的事情。不利用主题类的话,我们还需要不断循环创建实例,执行操作。而现在只需要创建实例就好,执行操作的事儿只需要调用一次通知的方法就好啦。

从开始的单例模式我一步步考虑如何实现代码,到现在大部分实现代码一句带过,实际上是建立在前面不断积累的基础上。真心感觉通过不断学习设计模式能很大加深对面向对象编程的思考。当然纸上谈兵还是要不得的,最好还是投入更多的练习中去吧~~·

相关文章:《使用观察者模式处理异常信息》

更多关于PHP相关内容感兴趣的读者可查看本站专题:《php面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

希望本文所述对大家PHP程序设计有所帮助。

(0)

相关推荐

  • php设计模式之单例模式用法经典示例分析

    本文实例讲述了php设计模式之单例模式用法.分享给大家供大家参考,具体如下: <?php /** * @desc 单例模式 * 目的:防止过多的new对象和clone对象,没有对象的时候new对象并缓存,始终保持都是同一个对象实例 * 特点:php的单例是进程中的单例,而不像java属于内存中的单例 * **/ class single{ protected static $ins = null;//声明一个静态变量,用来存储类的实例 private $name;//声明一个私有的实例变量 /*

  • php中的观察者模式简单实例

    观察者模式是设计模式中比较常见的一个模式,包含两个或者更多的互相交互的类.这一模式允许某个类观察另外一个类的状态,当被观察类的状态发生变化时候,观察者会进行得到通知进而更新相应状态. php的SPL标准类库提供了SplSubject和SplObserver接口来实现,被观察的类叫subject,负责观察的类叫observer.这一模式是SplSubject类维护了一个特定状态, 当这个状态发生变化时候,它就会调用notify方法.调用notify方法时,所有之前使用attach方法注册的SplO

  • PHP 设计模式之观察者模式介绍

    介绍 观察者模式定义对象的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新! 设计原则 在观察者模式中,会改变的是主题的状态以及观察者的数目.用这个模式,你可以改变依赖于主题状态的对象,却不必改变主题.--找出程序中会变化的方面,然后将其和固定不变的方面相分离! 主题和观察者都使用接口:观察者利用主题的接口向主题注册,而主题利用观察者接口通知观察者.这样可以让两者之间运作正常,又同时具有松耦合的优点! --针对接口编程,不针对实现编程! . 观察者模式利用"组合&

  • PHP设计模式之观察者模式(Observer)详细介绍和代码实例

    [意图] 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新[GOF95] 又称为发布-订阅(Publish-Subscribe)模式.模型-视图(Model-View)模式.源-监听(Source-Listener)模式.或从属者(Dependents)模式 [观察者模式结构图] [观察者模式中主要角色] 1.抽象主题(Subject)角色:主题角色将所有对观察者对象的引用保存在一个集合中,每个主题可以有任意多个观察者. 抽象主题提供了增加和

  • php设计模式之职责链模式定义与用法经典示例

    本文实例讲述了php设计模式之职责链模式定义与用法.分享给大家供大家参考,具体如下: <?php /** * @desc php设计模式之职责链模式(责任链模式) 定义:顾名思义,责任链模式为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计模式属于行为型模式. 在这种模式中,通常每个接收者都包含对另一个接收者的引用.如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推. * 模拟公司请假流程,实现职责链模式 * 项目主管:

  • php设计模式之工厂模式用法经典实例分析

    本文实例讲述了php设计模式之工厂模式用法.分享给大家供大家参考,具体如下: <?php /*** * @desc 工厂模式 * ***/ interface DB{ /* * @desc 接口类不体现具体实现,只是为了规范一套规则 * **/ public function conn(); public function add(); public function delete(); public function update(); public function select(); pu

  • php中的观察者模式

    观察者模式 复制代码 代码如下: interface Subject { public function Attach($Observer); //添加观察者 public function Detach($Observer); //踢出观察者 public function Notify(); //满足条件时通知观察者 public function SubjectState($Subject); //观察条件 } class Boss Implements Subject { public

  • php观察者模式应用场景实例详解

    本文实例讲述了php观察者模式的应用.分享给大家供大家参考,具体如下: <?php /** * 观察者模式应用场景实例 * * 免责声明:本文只是以哈票网举例,示例中并未涉及哈票网任何业务代码,全部原创,如有雷同,纯属巧合. * * 场景描述: * 哈票以购票为核心业务(此模式不限于该业务),但围绕购票会产生不同的其他逻辑,如: * 1.购票后记录文本日志 * 2.购票后记录数据库日志 * 3.购票后发送短信 * 4.购票送抵扣卷.兑换卷.积分 * 5.其他各类活动等 * * 传统解决方案: *

  • PHP 观察者模式深入理解与应用分析

    本文实例讲述了PHP 观察者模式.分享给大家供大家参考,具体如下: 用模式开发的优点是,能让我们的逻辑结构以及代码更加清晰,便于维护! 而我们为什么要用 "观察者模式"?这就需要从实际运用中来理解才能更好的运用!用如下的情境来说明吧. 事例,开始时我被安排做项目的登录,很快我就完成了.然后产品提出了另一个需求,用户登录后,给他们推送一条实时消息!然后我在登录成功的逻辑后加了一段代码,完成了登录后的实时消息推送.然而事情还没有完,产品又给加了个需求,需要给新登录的用户10块钱红包奖励,这

  • php设计模式之适配器模式原理、用法及注意事项详解

    本文实例讲述了php设计模式之适配器模式原理.用法及注意事项.分享给大家供大家参考,具体如下: 在这个有没有对象都要高呼"面向对象"的年代,掌握面向对象会给我们带来意想不到的方便.学编程的小伙伴从开始能写几行代码实现简单功能到后来懂得将一些重复的操作组合起来形成一个"函数",再到后来将"函数"和属性组合起来形成一个"类".一步步走来,我们在考虑着机器运行代码效率的提高的同时也在考虑减轻程序员的工作量. 那么我们今天讲到的适配器

随机推荐