zoukankan      html  css  js  c++  java
  • 观察者模式

    观察者模式是一种行为设计模式,允许你定义一种订阅机制,可在对象(A对象)事件发生时通知多个 ‘观察者’,即观察A对象的其他对象。

    代码示例

    注:PHP 中包含几个内置接口 SplSubject SplObserver 它们能让你的观察器模式实现与其他 PHP 代码兼容

    <?php
    
    class subject implements SplSubject
    {
        public $state;
    
        //存储订阅者,通知时候遍历使用
        private $observers;
    
        public function __construct()
        {
            $this->observers = new SplObjectStorage();
        }
    
        //添加订阅对象
        public function attach(SplObserver $observer)
        {
            // TODO: Implement attach() method.
            $this->observers->attach($observer);
        }
        
        //删除订阅对象
        public function detach(SplObserver $observer)
        {
            // TODO: Implement detach() method.
            $this->observers->detach($observer);
        }
        
        //遍历通知订阅者
        public function notify()
        {
            // TODO: Implement notify() method.
            foreach ($this->observers as $observer){
                $observer->update($this);
            }
        }
        
        //业务逻辑,业务变更时通知关联业务作出对应变更
        public function someBusinessLogic()
        {
            //模仿业务变更
            $this->state = mt_rand(0,10);
            
            //通知订阅者
            $this->notify();
        }
    }
    
    //订阅者A
    class  concreateObserverA implements SplObserver
    {
        public function update(SplSubject $subject)
        {
            // TODO: Implement update() method.
            echo 'A 关联业务变更';
        }
    }
    
    //订阅者B
    class  concreateObserverB implements SplObserver
    {
        public function update(SplSubject $subject)
        {
            // TODO: Implement update() method.
            echo 'B 关联业务变更';
        }
    }
    
    //客户端
    $subject = new subject();
    
    $conA = new concreateObserverA();
    //添加订阅者A
    $subject->attach($conA);
    
    $conB = new concreateObserverB();
    //添加订阅者B
    $subject->attach($conB);
    
    //业务逻辑变更后,通知订阅者使订阅者逻辑变更
    $subject->someBusinessLogic();
  • 相关阅读:
    如何轻松的从GAC文件夹拷贝dll出来
    UIManager的用法(用于改变界面风格)
    Java休眠睡眠方法
    Thread.currentThread().getContextClassLoader()与Test.class.getClassLoader()的区别
    Openfire编译命令
    Openfire插件开发
    通过Java代码打开浏览器,本地文件目录以及ftp站点
    使用Pack200压缩你的代码
    Java 创建文件与创建文件夹
    Openfire插件制作
  • 原文地址:https://www.cnblogs.com/suojian/p/14023448.html
Copyright © 2011-2022 走看看