第六节 PHP设计模式(五)—观察者模式 (observer Pattern)

观察者模式 (observer Pattern): 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。也叫发布-订阅模式

(一)为什么需要观察者模式

1,一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作

2,完美的将观察者和被观察的对象分离开,使得每个类将重点放在某一个功能上,一个对象只做一件事情。

3,观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性

(二)观察者模式 UML图
 这个设计模式的UML图比较全

(三)简单实例

观察者模式也叫发布订阅模式,如果说我们现在在做一个系统。我们让所有客户端订阅我们的服务端,那么当我们的服务端有更新信息的时候,就通知客户端去更新。这里的服务端就是被观察者,客户端就是观察者。

对于PHP来说观察者的另一种实现方式,是通过实现SplSubject接口和SplObserver,这种实现方法涉及到spl(standard php library)的内容,这里仅仅演示如何实现,具体的大家可以自行google||百度。

abstract class Entity{
    private $observers = [];

    public function add($observer)
    {
        // 注意 直接把对象作为字符串输出的话,会调用魔术方法__toString
        $this->observers[] = $observer;
        echo sprintf("%s观察者添加成功!<br/>", $observer);
    }

    public function delete($observer)
    {
        $key = array_search($observer, $this->observers);
        // 对象存在但是不一定是同一个对象,所以需要 === 判断一下
        if ($observer === $this->observers[$key]){
            unset($this->observers[$key]);
            echo sprintf("观察者删除成功!<br/>");
        }else{
            echo sprintf("观察者不存在!<br/>");
        }
    }

    public function notifyObserver()
    {
        foreach ($this->observers as $observer){
            $observer->save();
        }
    }
}

class server extends Entity{
    public function publish()
    {
        echo sprintf("618就要到了,活动福利多多请关注<br/>");
        $this->notifyObserver();
    }
}

Interface Observer{
    public function save();
}

class Wechat implements Observer{
    public function save()
    {
        echo sprintf("%s已经发送了!<br/>", __CLASS__);
    }
    // object to string 时调用
    public function __toString()
    {
        return __CLASS__;
    }
}
class Android implements Observer{
    public function save()
    {
        echo sprintf("%s已经发送了!<br/>", __CLASS__);
    }
    // object to string 时调用
    public function __toString()
    {
        return __CLASS__;
    }
}
class Ios implements Observer{
    public function save()
    {
        echo sprintf("%s已经发送了!<br/>", __CLASS__);
    }
    // object to string 时调用
    public function __toString()
    {
        return __CLASS__;
    }
}

// 实例化被观察者
$entity = new Server();
// 注册微信
$entity->add(new Wechat());
// 注册安卓
$entity->add(new Android());
$ios = new Ios();
// 注册IOS
$entity->add($ios);
// 触发时间,发送消息
$entity->publish();
//输出信息如下
//Wechat观察者添加成功!
//Android观察者添加成功!
//Ios观察者添加成功!
//618就要到了,活动福利多多请关注
//Wechat已经发送了!
//Android已经发送了!
//Ios已经发送了!

// 新实例化IOS 然后删除IOS
$entity->delete(new Ios()); // 会提示 观察者不存在!
// 再次发消息
$entity->publish();


// 删除IOS
$entity->delete($ios);
// 再次发消息
$entity->publish();
//输出信息如下
// ………………
//观察者删除成功!
//618就要到了,活动福利多多请关注
//Wechat已经发送了!
//Android已经发送了!

参考资料:

https://design-patterns.readthedocs.io

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值