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

    一、概述

    1、观察者模式(Observer),当一个对象的状态发生改变时,依赖他的对象会全部收到通知,并自动更新。

    2、场景:一个事件发生后,要执行一连串更新操作.传统的编程方式,就是在事件的代码之后直接加入处理逻辑,当更新得逻辑增多之后,代码会变得难以维护.这种方式是耦合的,侵入式的,增加新的逻辑需要改变事件主题的代码。
    观察者模式实现了低耦合,非侵入式的通知与更新机制。

    3、观察者模式包含的角色:
      ①Subject: 目标

      ②Observer: 观察者

      ③ConcreteSubject: 具体目标

      ④ConcreteObserver: 具体观察者

    二、代码实现

    1)抽象观察目标

    /*
     * 抽象观察目标,定义观察目标要实现的方法
     * */
    abstract class Subject
    {
        //定义数组存储观察目标
        protected $observers = array();
    
        //添加观察者
        abstract public function addObserver(Observer $observer);
    
        //删除观察者
        abstract public function delObserver(Observer $observer);
    
        //满足条件时通知所有观察者的操作
        abstract public function notify();
    
        //发起通知的条件
        abstract public function condition($num);
    }

    2)观察者接口

    /**
     * 观察者接口,定义所有观察者共同具有的操作——执行修改
     */
    interface Observer
    {
        function update();
    }

    3)具体观察目标

    /*
     * 具体观察目标
     */
    class ConcreteSubject extends Subject
    {
        //添加观察者
        public function addObserver(Observer $observer)
        {
            $this->observers[] = $observer;
        }
    
        //移除观察者
        public function delObserver(Observer $observer)
        {
            $key = array_search($observer, $this->observers);
            if ($key !== false) {  //注意不要写成!=,表达式0!=flase为flase
                unset($this->observers[$key]);
            }
        }
    
        //通知所有观察者去操作
        public function notify()
        {
            foreach ($this->observers as $key => $value) {
                $value->update();
            }
        }
    
        //发起通知的条件
        public function condition($num)
        {
            if ($num > 100) {
                $this->notify();
            }
        }
    }

    4)具体观察者

    /*
     * 具体观察者:观察者A
     * */
    class ConcreteObserverA implements Observer
    {
        function update()
        {
            echo "A报告:敌军超过一百人了,快撤!<br>";
        }
    
        //其他函数
        function eat()
        {
            echo "A在吃饭";
        }
    }
    
    /*
     * 具体观察者:观察者B
     * */
    class ConcreteObserverB implements Observer
    {
        function update()
        {
            echo "B报告:敌军超过一百人了,快撤!<br>";
        }
    
        //其他函数
        function sleep()
        {
            echo "B在睡觉";
        }
    }

    5)测试

    //测试
    $a       = new ConcreteObserverA();
    $b       = new ConcreteObserverB();
    $subject = new ConcreteSubject();
    
    $subject->addObserver($a);
    $subject->addObserver($b);
    $subject->condition(1000);
    
    
  • 相关阅读:
    进程详解(1)——可能是最深入浅出的进程学习笔记
    贪吃蛇游戏C语言源代码学习
    经典功率谱估计及Matlab仿真
    CAN总线(一)
    实验楼课程管理程序-深入学习《C++ Primer第五版》实验报告&学习笔记1
    Linux驱动开发概述
    assert的用法
    基于WDF的PCI/PCIe接口卡Windows驱动程序(4)- 驱动程序代码(源文件)
    基于WDF的PCI/PCIe接口卡Windows驱动程序(3)- 驱动程序代码(头文件)
    C语言中的union
  • 原文地址:https://www.cnblogs.com/jxl1996/p/10185267.html
Copyright © 2011-2022 走看看