登录
原创

php观察者模式学习记录

发布于 2020-12-23 阅读 435
  • 设计模式
原创

最近学习laravel事件监听功能,消费订阅的设计模式用到了设计模式中观察者模式的原型,复习下相关知识:
简单粗暴的说,就是对象1发生变化的时候,对象2,对象3跟着变化
所以有对象1,对象2,对象3,观察者对象(用来增加观察者和通知观察者的)
观察者模式 当一个对象的状态发生改变时,他的对象会全部收到通知,并自动更新

场景:当一个事件发生后,要执行一连串更新操作,传统的编程方式,就是在事件的代码之后直接加入处理逻辑,当更新逻辑增多之后,代码变得难以维护,这种方式是耦合式的,侵入式的,增加新的逻辑需要改变事件主题的代码

观察者模式实现了低耦合,非侵入式的通知与更新
观察者模式包含了四种角色:

主题(Subject):主题是一个接口,该接口规定了具体主题需要实现的方法,比如,添加,删除观察者以及通知观察者数据更新的方法

观察者(Observer):观察者是一个接口,该接口规定了具体观察者用来更新数据的方法。

具体主题(ConcreteSuject):具体主题是实现主题接口类的一个实例,该实例包含有可以经常发生变化的数据。具体主题要用一个集合来存放观察者的引用。

具体观察者(ConcreteObserver):具体观察者是实现观察者接口的一个实例。具体观察者包含有可以存放具体主题引用的接口变量,以便具体观察者让具体主题将自己的引用添加到具体主题的集合中去,使自己成为观察者,或让这个具体主题将自己删除。

UML类图

20200218215504130.png

代码实现

代码实现如下:

 <?php
// 主题接口
interface Subject{
    public function register(Observer $observer);
    public function notify();
}
// 观察者接口
interface Observer{
    public function watch();
}
// 主题
class Action implements Subject{
    public $_observers=array();
    public function register(Observer $observer){
        $this->_observers[]=$observer;
    }
 
    public function notify(){
        foreach ($this->_observers as $observer) {
            $observer->watch();
        }
 
    }
}
 
// 观察者
class Cat implements Observer{
    public function watch(){
        echo "Cat watches TV<hr/>";
    }
}
class Dog implements Observer{
    public function watch(){
        echo "Dog watches TV<hr/>";
    }
}
class People implements Observer{
    public function watch(){
        echo "People watches TV<hr/>";
    }
}
 
// 应用实例
$action=new Action();
$action->register(new Cat());
$action->register(new People());
$action->register(new Dog());
$action->notify();

评论区

励志做一条安静的咸鱼,从此走上人生巅峰。

0

0

0

举报