PHP 设计模式十六 观察者模式

608 阅读1分钟

「这是我参与11月更文挑战的第23天,活动详情查看:2021最后一次更文挑战

课程背景

  • 最近完成一个项目 对于代码分层有了一丢丢了解 但是架构设计合理性上存在问题
  • 万物看本质基本功硬 底层知识扎实才能写出更优质的代码 才能走得更远
  • 作为努力奔跑的程序员 又一次的去温习 思考 设计模式等基础的php知识
  • 因为掘金粑粑有奖励,所以把学习的笔记整理记录并分享了出来。

正文开始

这里继续上一节中的内容 2 创建观察者统一处理类 \Observer\EquipSaveOb.php

<?php
namespace Observer;
/**
 * 创建抽象类 保证只能被继承 不能被实例化
 */
abstract class EquipSaveOb{

    private $observer_arr = []; //保存观察者

    /**
     * 添加观察者
     * 必须是实现了EquipSaveI接口的对象才能添加到观察者中
     */
    public function addObServer(\Observer\EquipSaveI $server){
        $this->observer_arr[] = $server;
    }

    /**
     * 执行操作
     */
    public function executeAll(){
        foreach ($this->observer_arr as $key => $value) {
            $value->execute();
        }
    }
}

因为抽象类只能被继承不能被创建的特点,这就保证了,想要使用这个观察者就必须是继承自类EquipSaveOb才可以。

3 我们创建具体执行操作的类,然后继承上面的观察者方法

<?php
namespace Observer;

class EquipSave extends EquipSaveOb{

    /**
     * 执行保存的操作
     */
    public function save(){
        $this->executeAll();
    }
}

这边绑定观察者,跟执行的方法已经编写完成。我们要做的就是给当前操作添加观察者,然后就会依次执行每个观察者中的代码。

4 创建观察者,并执行操作

class Message implements \Observer\EquipSaveI{
    public function execute(){
        echo '设备站内信<br>';
    }
}

class Notify implements \Observer\EquipSaveI{
    public function execute(){
        echo '设备短信通知<br>';
    }
}

$res = new \Observer\EquipSave();
$res->addObServer(new Message());
$res->addObServer(new Notify());
$res->save();

添加了两个类,对应两个操作。此时访问url,会看到执行成功的返回结果。

image.png