码迷,mamicode.com
首页 > Web开发 > 详细

PHP设计模式之----观察者模式

时间:2018-12-27 18:56:47      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:ase   模式   his   arch   状态   array   16px   value   sub   

一、概述

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);

 

PHP设计模式之----观察者模式

标签:ase   模式   his   arch   状态   array   16px   value   sub   

原文地址:https://www.cnblogs.com/jxl1996/p/10185267.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!