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

      当对象间存在一对多关系时,则使用观察者模式。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。

    <?php
    interface Subject{
        public function attach(Observer $observer);
        public function detach(Observer $observer);
        public function notify();
    }
    
    class SubjectItem implements Subject{
        private $observer_list;
        private $num;
    
        public function __construct(){
            $this->observer_list = new SplObjectStorage;
        }
    
        public function attach(Observer $observer){
            $this->observer_list->attach($observer);
        }
    
        public function detach(Observer $observer){
            $this->observer_list->detach($observer);
        }
    
        public function setNum($num){
            $this->num = $num;
            $this->notify();
        }
    
        public function getNum(){
            return $this->num;
        }
    
        public function notify(){
            for($this->observer_list->rewind();$this->observer_list->valid();$this->observer_list->next()){
                $this->observer_list->current()->update($this);
            }
    
        }
    }
    
    abstract class Observer{
        abstract function update(Subject $subject);
    }
    
    class BinObserver extends Observer{
        public function update(Subject $subject){
            echo "二进制更新:".decbin($subject->getNum())."
    ";
        }
    }
    
    class OctObserver extends Observer{
        public function update(Subject $subject){
            echo "八进制更新:".decoct($subject->getNum())."
    ";
        }
    }
    
    class HexObserver extends Observer{
        public function update(Subject $subject){
            echo "十六进制更新:".dechex($subject->getNum())."
    ";
        }
    }
    
    $subject = new SubjectItem();
    $subject->attach(new BinObserver());
    $subject->attach(new OctObserver());
    $subject->attach(new HexObserver());
    $subject->setNum(22);

    运行结果:

    二进制更新:10110
    八进制更新:26
    十六进制更新:16
  • 相关阅读:
    Java网络编程注意事项3
    存储在图的形式——邻接矩阵(排列)
    C++ Primer 学习笔记_35_STL实践与分析(9)--map种类(在)
    [Django1.6]south于django1.6使用
    《Javascript权威指南》13号学习笔记:使用日期和时间
    POJ 1699 Best Sequence (DFS+预处理)
    第五蓝桥杯 蚂蚁冷
    Mac OS X 在捕捉AppLAN通信包
    面向对象、内存模型、动态绑定
    链接器与分离编译
  • 原文地址:https://www.cnblogs.com/itsuibi/p/11058164.html
Copyright © 2011-2022 走看看