博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP设计模式之----观察者模式
阅读量:6923 次
发布时间:2019-06-27

本文共 2061 字,大约阅读时间需要 6 分钟。

一、概述

1、观察者模式(Observer),当一个对象的状态发生改变时,依赖他的对象会全部收到通知,并自动更新。

2、场景:一个事件发生后,要执行一连串更新操作.传统的编程方式,就是在事件的代码之后直接加入处理逻辑,当更新得逻辑增多之后,代码会变得难以维护.这种方式是耦合的,侵入式的,增加新的逻辑需要改变事件主题的代码。
观察者模式实现了低耦合,非侵入式的通知与更新机制。
3、观察者模式包含的角色:
  ①Subject: 目标

  ②Observer: 观察者

  ③ConcreteSubject: 具体目标

  ④ConcreteObserver: 具体观察者

二、代码实现

1)抽象观察目标

/* * 抽象观察目标,定义观察目标要实现的方法 * */abstract class Subject{    //定义数组存储观察目标    protected $observers = array();    //添加观察者    abstract public function addObserver(Observer $observer);    //删除观察者    abstract public function delObserver(Observer $observer);    //满足条件时通知所有观察者的操作    abstract public function notify();    //发起通知的条件    abstract public function condition($num);}

2)观察者接口

/** * 观察者接口,定义所有观察者共同具有的操作——执行修改 */interface Observer{    function update();}

3)具体观察目标

/* * 具体观察目标 */class ConcreteSubject extends Subject{    //添加观察者    public function addObserver(Observer $observer)    {        $this->observers[] = $observer;    }    //移除观察者    public function delObserver(Observer $observer)    {        $key = array_search($observer, $this->observers);        if ($key !== false) {  //注意不要写成!=,表达式0!=flase为flase            unset($this->observers[$key]);        }    }    //通知所有观察者去操作    public function notify()    {        foreach ($this->observers as $key => $value) {            $value->update();        }    }    //发起通知的条件    public function condition($num)    {        if ($num > 100) {            $this->notify();        }    }}

4)具体观察者

/* * 具体观察者:观察者A * */class ConcreteObserverA implements Observer{    function update()    {        echo "A报告:敌军超过一百人了,快撤!
"; } //其他函数 function eat() { echo "A在吃饭"; }}/* * 具体观察者:观察者B * */class ConcreteObserverB implements Observer{ function update() { echo "B报告:敌军超过一百人了,快撤!
"; } //其他函数 function sleep() { echo "B在睡觉"; }}

5)测试

//测试$a       = new ConcreteObserverA();$b       = new ConcreteObserverB();$subject = new ConcreteSubject();$subject->addObserver($a);$subject->addObserver($b);$subject->condition(1000);

 

 

转载于:https://www.cnblogs.com/jxl1996/p/10185267.html

你可能感兴趣的文章
翻译连载 | 第 11 章:融会贯通 -《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇...
查看>>
去中心化访问HTTP服务集群
查看>>
C语言switch语句的用法详解
查看>>
Linux系统和用户界面 中英文语言修改
查看>>
ELK(ElasticSearch, Logstash, Kibana)搭建实时日志分析平台
查看>>
centos6.9 上docker 的安装 及启动 和运行状态查看
查看>>
Linux安装类型和方法
查看>>
Java面试宝典(2)Java基础部分
查看>>
步入Android江湖 有你才会更精彩
查看>>
2011年度盘点云计算工具典型代表大检兵
查看>>
IT名列跳槽榜前三 软件人才需求爆棚
查看>>
决定留在开源社区
查看>>
我的友情链接
查看>>
android 控件-TextView用法整理
查看>>
HTTP教程2
查看>>
动态添加classpath
查看>>
条件判断
查看>>
linux cache
查看>>
PHP高效率写法
查看>>
三日php之路 -- 第一天(初识php)
查看>>