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

    概念

    观察者模式属于行为模式,是定义对象间的一种一对多的依赖关系,以便当一个对象(主题——被观察者)的状态发生改变时,所有依 赖于它的对象(观察者)都得到通知并自动刷新。它完美的将观察者对象和被观察者对象分离。 让所有观察器各自实现公共的 SplObserver接口,让所有独立的对象(主题——被观察者)实现SplSubject接口,以取消主体和依赖性对象之间的直接依赖关系。

    运用场景

    以点购买电影票为例,购买成功后,会有如下操作

    1、通知购票者,订单成功支付,并放回对应的信息。

    2、数据库会记录日志

    3、购票送抵扣卷、兑换卷、积分

    4、等等其他各类活动

    实现

    观察者模式典型实现方式:

    1、定义2个接口:观察者(通知)接口、被观察者(主题)接口

    2、定义2个类,观察者对象实现观察者接口、主题类实现被观者接口

    3、主题类注册自己需要通知的观察者

    4、主题类某个业务逻辑发生时通知观察者对象,每个观察者执行自己的业务逻辑。

    class MyObserver1 implements SplObserver {
        public function update(SplSubject $subject) {
            echo __CLASS__ . ' - ' . $subject->getName();
        }
    }
    
    class MyObserver2 implements SplObserver {
        public function update(SplSubject $subject) {
            echo __CLASS__ . ' - ' . $subject->getName();
        }
    }
    
    class MySubject implements SplSubject {
        private $_observers;
        private $_name;
    
        public function __construct($name) {
            $this->_observers = new SplObjectStorage();
            $this->_name = $name;
        }
    
        public function attach(SplObserver $observer) {
            $this->_observers->attach($observer);
        }
    
        public function detach(SplObserver $observer) {
            $this->_observers->detach($observer);
        }
    
        public function notify() {
            foreach ($this->_observers as $observer) {
                $observer->update($this);
            }
        }
    
        public function getName() {
            return $this->_name;
        }
    }
    
    $observer1 = new MyObserver1();
    $observer2 = new MyObserver2();
    
    $subject = new MySubject("test");
    
    $subject->attach($observer1);
    $subject->attach($observer2);
    $subject->notify();
    
    /* 
    will output:
    
    MyObserver1 - test
    MyObserver2 - test
    */
    
    $subject->detach($observer2);
    $subject->notify();
    
    /* 
    will output:
    
    MyObserver1 - test
    */

    官网文档:http://www.php.net/manual/zh/class.splsubject.php

  • 相关阅读:
    fullCalendar改造计划之带农历节气节假日的万年历(转)
    Linked List Cycle
    Remove Nth Node From End of List
    Binary Tree Inorder Traversal
    Unique Binary Search Trees
    Binary Tree Level Order Traversal
    Binary Tree Level Order Traversal II
    Plus One
    Remove Duplicates from Sorted List
    Merge Two Sorted Lists
  • 原文地址:https://www.cnblogs.com/webph/p/6734217.html
Copyright © 2011-2022 走看看