设为首页收藏本站

就爱编程论坛

 找回密码
 注册

人人连接登陆

无需注册,直接登录

用新浪微博连接

一步搞定

QQ登录

只需一步,快速开始

查看: 445|回复: 0
打印 上一主题 下一主题

php面向对象编程 – 观察者模式 [复制链接]

Rank: 9Rank: 9Rank: 9

  • TA的每日心情
    无聊
    2025-5-27 03:37:20
  • 签到天数: 366 天

    [LV.9]以坛为家II

    论坛先锋 学习至圣 荣誉成员 论坛元老 活跃之星 终极领袖

    我玩的应用:

    跳转到指定楼层
    楼主
    发表于 2012-4-2 21:58:52 |只看该作者 |倒序浏览

    这篇文章介绍一下设计模式中的观察者模式。 观察者模式应用到php面向对象编程中,可以避免组件之间紧密耦合。另外的关于如何避免组件之间机密耦合的方法,可以参考php面向对象编程 – 使用接口实现松散耦合这篇文章。
    观察者模式非常简单:一个对象通过添加一个方法(该方法允许另一个对象,即观察者 注册自己)使本身变得可观察。当可观察的对象更改时,它会将消息发送到已注册的观察者。这些观察者使用该信息执行的操作与可观察的对象无关。结果是对象可以相互对话,而不必了解原因。


    一个简单示例是系统中的用户列表。下面的代码显示一个用户列表,添加用户时,它将发送出一条消息。添加用户时,通过发送消息的日志观察者可以观察此列表。

    <?php
    interface IObserver
    {
    function onChanged( $sender, $args );
    }
    
    interface IObservable
    {
    function addObserver( $observer );
    }
    
    class UserList implements IObservable
    {
    private $_observers = array();
    
    public function addCustomer( $name )
    {
    foreach( $this->_observers as $obs )
    $obs->onChanged( $this, $name );
    }
    
    public function addObserver( $observer )
    {
    $this->_observers []= $observer;
    }
    }
    
    class UserListLogger implements IObserver
    {
    public function onChanged( $sender, $args )
    {
    echo( "'$args' added to user list\n" );
    }
    }
    
    $ul = new UserList();
    $ul->addObserver( new UserListLogger() );
    $ul->addCustomer( "Jack" );
    ?>
    

    此代码定义四个元素:两个接口和两个类。IObservable 接口定义可以被观察的对象,UserList 实现该接口,以便将本身注册为可观察。IObserver 列表定义要通过怎样的方法才能成为观察者,UserListLogger 实现 IObserver 接口。
    如果在命令行中运行它,您将看到以下输出:
    % php observer.php'Jack' added to user list%
    测试代码创建 UserList,并将 UserListLogger 观察者添加到其中。然后添加一个消费者,并将这一更改通知 UserListLogger。
    认识到 UserList 不知道日志程序将执行什么操作很关键。可能存在一个或多个执行其他操作的侦听程序。例如,您可能有一个向新用户发送消息的观察者,欢迎新用户使用该系统。这种方法的价值在于 UserList 忽略所有依赖它的对象,它主要关注在列表更改时维护用户列表并发送消息这一工作。
    此模式不限于内存中的对象。它是在较大的应用程序中使用的数据库驱动的消息查询系统的基础。




    该贴已经同步到 admin的微博
    分享到: QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    分享分享0 收藏收藏0 支持支持0 反对反对0 分享到人人 转发到微博
    [img=http://mail.qq.com/cgi-bin/qm_share?t=qm_mailme&email=fRUcHhYWGAQ9GxIFEBwUEVMeEhA]http://rescdn.qqmail.com/zh_CN/htmledition/images/function/qm_open/ico_mailme_02.png[/img]

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册 人人连接登陆

    晴云孤魂's Blog|就爱编程搜帖|手机版|Archiver|就爱编程论坛     

    GMT+8, 2025-7-1 21:39 , Processed in 0.092949 second(s), 27 queries .

    Powered by Discuz! X2

    © 2001-2011 Comsenz Inc.

    回顶部