zoukankan      html  css  js  c++  java
  • php设计模式之观察者模式

    观察者模式:能够更便利地创建查看目标对象状态的对象,并且提供与核心对象非耦合的指定功能性。

    利用这种模式可以方便地创建一个对象(观察者),其可以用来“监视”另一个对象(被观察者)的状态。这样,就可以在不必完全重构某些核心对象(可以理解成被观察者)的情况下,向现有的应用层序填加额外的功能。

    即是动态创建对象(观察者),根据被观察者的状态动态调用观察者动作行为。

    1. 被观察者 添加观察者,(attach)

    2. 根据被观察者动态调用观察者的行为,即运行观察者。(notify)

    一、php库中定义的接口splSubject  splObserver

    <?php
    class Subject implements SplSubject {
        protected $_value;
        protected $_observers;
        public function __construct() {
            $this->_observers = new SplObjectStorage ();
        }
        public function attach(SplObserver $object) {
            $this->_observers->attach ( $object );
        }
        public function detach(SplObserver $object) {
            $this->_observers->detach ( $object );
        }
        public function notify() {
            foreach ( $this->_observers as $object ) {
                $object->update ( $this );
            }
        }
        public function setValue($value) {
            $this->_value = $value;
            $this->notify ();
        }
        public function getValue() {
            return $this->_value;
        }
    }
    class Observer implements SplObserver {
        public function update(SplSubject $subject) {
            var_dump ( "最后更新时间为:" . $subject->getValue () );
        }
    }
    
    date_default_timezone_get ( 'Asia/Shanghai' );
    
    error_reporting ( E_ALL );
    $subject = new Subject ();
    $observer = new Observer ();
    $subject->attach ( $observer );
    $subject->setValue ( date( 'Y-m-d H:i:s' ), time () );


    二 .自定义观察者模式

    <?php
    class order {
    
        protected $observers = array(); // 存放观察容器
         
        //观察者新增
        public function addObServer($type, $observer) {
            
            $this->observers[$type][] = $observer;
        }
        
    
        //运行观察者
        public function obServer($type) {
            if (isset($this->observers[$type])) {
                foreach ($this->observers[$type] as $obser) {
                    $a = new $obser;
                    $a->update($this); //公用方法
                }
            }
        }
         
        //下单购买流程
        public function create() {
            echo '购买成功';
            $this->obServer('buy'); // buy动作
        }
    }
    
    class orderEmail {
        public static function update($order) {
            echo '发送购买成功一个邮件';
        }
    }
    class orderStatus {
        public static function update($order) {
            echo '改变订单状态';
        }
    }
    $ob = new order;
    $ob->addObServer('buy', 'orderEmail');
    $ob->addObServer('buy', 'orderStatus');
    $ob->create();
  • 相关阅读:
    架构漫谈(七):不要空设架构师这个职位,给他实权
    架构漫谈(六):软件架构到底是要解决什么问题?
    架构漫谈(五):什么是软件
    架构漫谈(四):如何做好架构之架构切分
    架构漫谈(三):如何做好架构之识别问题
    [BZOJ 4361] isn(容斥/DP)
    [BZOJ 4767] 两双手(容斥/DP)
    [HNOI2011]卡农(容斥/DP)
    [洛谷] OSU!(期望DP)
    [洛谷] 纯粹容器(结论/期望)
  • 原文地址:https://www.cnblogs.com/hubing/p/3291112.html
Copyright © 2011-2022 走看看