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
  • 相关阅读:
    2018.12.30【NOIP提高组】模拟赛C组总结
    【NOIP2007提高组】矩阵取数游戏
    【NOIP2007提高组】字符串的展开
    【NOIP2007提高组】统计数字
    2018.12.22【NOIP提高组】模拟B组总结
    【NOIP2013模拟11.5A组】cza的蛋糕(cake)
    CDQ分治总结
    O(2),O(3),Ofast 手动开[吸氧]
    【NOIP2013模拟11.6A组】灵能矩阵(pylon)
    【GDKOI2012模拟02.01】数字
  • 原文地址:https://www.cnblogs.com/itsuibi/p/11058164.html
Copyright © 2011-2022 走看看