设为首页 收藏本站
查看: 444|回复: 0

[经验分享] PHP设计模式:观察者模式

[复制链接]

尚未签到

发表于 2018-12-12 14:03:27 | 显示全部楼层 |阅读模式
  首先来看个栗子:
//事件
class EventDemo
{
    //触发了新事件
    public function trigger()
    {
        echo "Event happening\r";
        echo "后续业务更新逻辑1\r\n";
        echo "后续业务更新逻辑2\r\n";
        echo "后续业务更新逻辑3\r\n";
    }
}  场景:当事件发生变化时,触发其他业务进行相关的操作
  特征1.所有业务代码都是***式的,直接放置于核心业务当中。
  2.耦合度太高,不便于管理维护。需要一件一件事去做处理。
  

  于是我们可以这样假设:
  假如后续业务都是都是该事件的关注者,当事件发生改变,只需要通知到观察者即可。其他的工作由观察者自行完成。
  类似发布--订阅这种模式。
  代码实现:
  步骤1.定义观察者接口
  步骤2.定义观察者类
  步骤3.定义事件产生器(抽象类)
  步骤4.定义事件场景类(继承并实现事件产生器抽象类)
  步骤5.实例化运用
            实例化事件场景-->添加观察者-->通知
  

  定义观察者接口
/**
* 定义观察者接口(观察对象为事件发生者)
*Interface Observer
*/
interface Observer
{
    /**
     * 事件发生时,进行更新操作
     * @param null $eventInfo 发生事件的信息
     * @return mixed
     */
    public function update($eventInfo = null);
}  定义观察者类
//定义多个观察者
class Observer1 implements Observer
{
    public function update($eventInfo = null)
    {
        echo "观察者1:准备开始{$eventInfo} \r\n";
    }
}
class Observer2 implements Observer
{
    public function update($eventInfo = null)
    {
        echo "观察者2:准备开始{$eventInfo} \r\n";
    }
}  定义事件产生器(抽象类)
/**
* 事件产生者(抽象类)
* Class EventGenerator
*/
abstract class EventGenerator
{
    private $observers = [];//事件的所有观察者
    /**
     * 增加观察者
     * @return mixed
     */
    public function addObserver(Observer $observer)
    {
        $this->observers[] = $observer;
    }
    /**
     * 通知事件发生了,其他观察者接到通知后更新业务逻辑
     * @return mixed
     */
    public function notify($eventInfo)
    {
        foreach ($this->observers as $observer) {
            $observer->update($eventInfo);
        }
    }
}  定义事件场景类(继承并实现事件产生器抽象类)
/**
* 定义事件类(继承事件产生者类)
* Class Event
*/
class Event extends EventGenerator
{
    public function trigger($eventInfo)
    {
        echo "事件 :{$eventInfo} 即将发生,通知观察者们做好更新准备\r\n";
        $this->notify($eventInfo);
        echo "";
    }
}  主业务场景的实现
$event = new Event();
//此处可以动态添加、删除观察者
$event->addObserver(new Observer1());
//$event->addObserver(new Observer2());

//此处可以发生任意多个事件
$event->trigger('吃饭');
$event->trigger('喝水');
$event->trigger('走路');  至此,我们可以看到在主业务场景中,只需要简单的管理(添加、删除)观察者,管理(添加、删除)发生事件就可以实现简化代码逻辑,减少耦合完成任务。更好的好处是,业务代码解耦合,便于后期的维护扩展。





运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-650622-1-1.html 上篇帖子: LAMP架构(PHP的安装解析) 下篇帖子: CentOS6.x安装php5.6.x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表