dmz社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 11008|回复: 193

[功能实现] 设计模式之php实现观察者模式

  [复制链接]
  • TA的每日心情

    2024-11-19 20:46
  • 签到天数: 244 天

    [LV.8]以坛为家I

    4434

    主题

    1459

    帖子

    1万

    积分

    会|员

    Rank: 9Rank: 9Rank: 9

    积分
    10839
    发表于 2018-11-23 23:49:28 | 显示全部楼层 |阅读模式

    本站资源全部免费,回复即可查看下载地址!

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    当一个对象或事件发生变化时,其他的对象实例或者事件需要跟着发生相应改动或者进行相应动作的一对多关系可进行应用。
    如:订单状态变化(支付完成)后需要进行,短信通知,公众号推送等一系列相应操作时。可将订单类看成一个被观察者,短信通知类,公众号通知,app推送等相关通知类视为观察者。
    具体实现和调用步骤:
      分别实现 SplSubject、SplObserver类,在SplSubject实现类中实例化SplObjectStorage类进行对象的存储
      将观察者对象分别加入被观察者对象进行存储  
      在对象发生变化后调用通知方法,逐个通知观察者对象进行相关操作
    好处:
      避免进行无数的判断操作,造成代码臃肿,不美观
      降低耦合度

    [PHP] 纯文本查看 复制代码
    <?php
    header("Content-Type: text/html;charset=utf-8");
    class test implements SplSubject{//被观察者类
    
        public $_observer;
        public $num;
        public $ad;
        function __construct()
        {
            $this->_observer = new SplObjectStorage();
        }
    
        public function run(){
            $this->notify();
            print_r($this);
        }
    
        public function attach(SplObserver $observer)
        {
            // TODO: 添加观察者对象
            $this->_observer->attach($observer);
        }
    
        public function detach(SplObserver $observer)
        {
            // TODO: Implement detach() method.
            $this->_observer->detach($observer);
        }
    
        public function notify()
        {
            // TODO: Implement notify() method.
            foreach ($this->_observer as $obj){
                $obj->update($this);
            }
        }
    }
    
    class checkNum implements SplObserver{
        public function update(SplSubject $subject)
        {
            // TODO: 根据通知更新
            $subject->num = "检查次数";
        }
    }
    
    class checkAd implements SplObserver{
        public function update(SplSubject $subject)
        {
            // TODO: 根据通知更新
            $subject->ad = "检查广告";
        }
    
    }
    
    $test = new test();
    $test->attach(new checkNum());
    $test->attach(new checkAd());
    $test->run();
    回复

    使用道具 举报

    该用户从未签到

    22

    主题

    7846

    帖子

    992

    积分

    终身会员[A]

    Rank: 7Rank: 7Rank: 7

    积分
    992

    发表于 2018-11-24 08:17:41 | 显示全部楼层
    我是来刷分的,嘿嘿
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    18

    主题

    7874

    帖子

    1016

    积分

    终身会员[A]

    Rank: 7Rank: 7Rank: 7

    积分
    1016

    发表于 2018-11-24 09:07:46 | 显示全部楼层
    路过,学习下
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    26

    主题

    7770

    帖子

    1037

    积分

    终身会员[A]

    Rank: 7Rank: 7Rank: 7

    积分
    1037

    发表于 2018-11-24 16:20:22 | 显示全部楼层
    我是来刷分的,嘿嘿
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    21

    主题

    7719

    帖子

    998

    积分

    终身会员[A]

    Rank: 7Rank: 7Rank: 7

    积分
    998

    发表于 2018-11-25 12:00:42 | 显示全部楼层
    正需要,支持楼主大人了!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    34

    主题

    7843

    帖子

    1025

    积分

    终身会员[A]

    Rank: 7Rank: 7Rank: 7

    积分
    1025

    发表于 2018-11-26 09:37:58 | 显示全部楼层
    相当不错,感谢无私分享精神!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    35

    主题

    7882

    帖子

    1006

    积分

    终身会员[A]

    Rank: 7Rank: 7Rank: 7

    积分
    1006

    发表于 2018-11-26 13:23:11 | 显示全部楼层
    没看完~~~~~~ 先顶,好同志
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    20

    主题

    7880

    帖子

    986

    积分

    终身会员[A]

    Rank: 7Rank: 7Rank: 7

    积分
    986

    发表于 2018-11-27 14:06:21 | 显示全部楼层
    路过,支持一下啦
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    28

    主题

    7821

    帖子

    972

    积分

    终身会员[A]

    Rank: 7Rank: 7Rank: 7

    积分
    972

    发表于 2018-11-27 14:52:07 | 显示全部楼层
    学习了,谢谢分享、、、
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    40

    主题

    7912

    帖子

    1004

    积分

    终身会员[A]

    Rank: 7Rank: 7Rank: 7

    积分
    1004

    发表于 2018-11-27 15:19:07 | 显示全部楼层
    支持一下:lol
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|小黑屋|本站代理|dmz社区

    GMT+8, 2025-2-2 05:57 , Processed in 0.113398 second(s), 42 queries .

    Powered by Discuz! X3.4 Licensed

    Copyright © 2001-2021, Tencent Cloud.

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