php设计模式之观察者(observer)模式

该模式属于行为型模式

什么是观察者模式?

它是一种事件系统,意味着这一模式允许某个类观察另一个类的状态,当被观察的类的状态发生改变的时候,观察类可以收到通知并且做出相应的动作。观察者模式提供了避免组件之间紧密耦合的另一种方法。


比如说:A类和B类 A类在观察B类的状态,如果发现B类的状态发生改变,那么A类会马上收到通知 并且做出相应的动作。


话不多说上代码:

<?php

//观察者模式涉及到2个类或多个类

//这里我们创建 男人类(在这里我们将该类定义为被观察者类) 和 女朋友类(在这里我们将该类定义为观察者类)
//男人类对象->小明  女朋友类对象->小丽
//代码模拟实现:当小明这个对象花钱的时候 小丽这个对象立刻做出相应动作


//定义一个男人类(被观察者类)
class Man
{
    //该属性 用来存放观察者
    public $observers = array();

    //该方法 用来添加观察者
    public function addObserver($observer)
    {
        $this->observers[] = $observer;
    }

    //花钱的方法
    public function buy()
    {
        //当男人类的对象调用buy这个方法的时候,就立刻向女朋友类的对象发出通知,然后女朋友类的对象立马做出相应反应
        //当被观察者做出这个行为的时候,让观察者得到通知,并且做出相应反应
        foreach($this->observers as $girl)
        {
            $girl->dongjie(); //向观察者发出通知
        }
    }

    //删除观察者方法
    public function removeObserver($observer)
    {
        //在$this->observers属性中搜索$observer这个值,搜索到了返回该值对应的键名
        $key = array_search($observer, $this->observers);

        //使用array_splice函数来删除某个数组中的元素:从$this->observers属性中删除从$key的位置开始,移除1个元素
        array_splice($this->observers, $key, 1);
    }
}


//定义一个女朋友类(观察者类)
class GirlFriend
{
    //观察者收到通知,并作出下一步反应
    public function dongjie()
    {
        echo '警告!你的男朋友正在花钱。哦,马上冻结他的银行卡!!!';
    }
}


//创建对象
$xiaoming = new Man();
$xiaoli   = new GirlFriend();

//添加观察者
$xiaoming->addObserver($xiaoli);

$xiaoming->buy(); //output:警告!你的男朋友正在花钱。哦,马上冻结他的银行卡!!!

//删除某个观察者
$xiaoming->removeObserver($xiaoli);



声明:禁止任何非法用途使用,凡因违规使用而引起的任何法律纠纷,本站概不负责。

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

精彩评论

全部回复12人评论7,777人参与