资讯专栏INFORMATION COLUMN

php设计模式系列--观察者模式

lykops / 3451人阅读

摘要:模式定义观察者模式定义对象间的一种一对多或一对一的依赖关系,当被观察者状态发生改变时,注册的观察者都会被通知。需要在系统中创建一个触发链,对象的行为将影响对象,对象的行为将影响对象,可以使用观察者模式创建一种链式触发机制。

模式定义

观察者模式(observer pattern): 定义对象间的一种一对多(或一对一)的依赖关系,当被观察者状态发生改变时,注册的观察者都会被通知。
观察者模式又称 发布-订阅(publish/subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式

模式动机

建立一种对象和对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象收到通知各自处理自己的业务逻辑。这里发生改变的对象称为被观察者,被通知的对象称为观察者。这些观察者之间没有关系,可以根据业务需求添加或删除观察者,便于系统维护和扩展。

模式结构

Subject(目标)

ConcreteSubject(具体目标)

Observer: 观察者

ConcreteObserver:具体观察者

UML 图

代码示例

代码实现的场景: 假设有个一个商人卖东西,他的用户有穷人和富人两类,商人的商品可能会涨价也可能会降价 价格波动对穷人和富人的购买行为有不同的影响。
分析: 这里的观者目标是 商品价格 ,被观察者是穷人和富人,商品价格变化将会通知穷人和富人,穷人富人对购买做出不同的反映。

// 目标
interface Observables
{
    public function attach(Observer $ob);
    public function detach(Observer $ob);
    public function notify();
}



// 具体目标

class Saler implements Observables
{
    protected  $obs = [];
    protected  $range = 0;

    public function attach(Observer $ob)
    {
        $this->obs[] = $ob;
    }

    public function detach(Observer $ob)
    {
        foreach ($this->obs as $k=>$v){
            if($v != $ob){
                $this->obs[] = $v;
            }
        }
    }

    public function notify()
    {
        // $this->range 为0表示价格不变 大于0涨价 小于0降价
        if($this->range != 0){
            foreach ($this->obs as $ob) {
                $ob->update($this);
            }
        }
    }

    public function increPrice($range)
    {
        $this->range = $range;
    }

    public function getRange()
    {
        return $this->range;
    }
}

  // 观察者
  interface Observer
  {
    public function update(Observables $obv);
  }

 //具体观察者(穷人)
class PoorBuyer implements Observer{
public function update(Observables $obv)
{
    if($obv->getRange()>0){
        echo "穷人:涨价不买了
"; }else{ echo "穷人:降价了赶紧买
"; } } } //具体观察者(富人) class RichBuyer implements Observer{ public function update(Observables $obv) { echo "富人:价格波动没关系,继续购买
"; } }
模式应用场景

一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这些方面封装在独立的对象中使它们可以各自独立地改变和复用

一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少对象将发生改变,可以降低对象之间的耦合度。

一个对象必须通知其他对象,而并不知道这些对象是谁。

需要在系统中创建一个触发链,A对象的行为将影响B对象,B对象的行为将影响C对象……,可以使用观察者模式创建一种链式触发机制。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/26309.html

相关文章

  • php设计模式

    摘要:我们今天也来做一个万能遥控器设计模式适配器模式将一个类的接口转换成客户希望的另外一个接口。今天要介绍的仍然是创建型设计模式的一种建造者模式。设计模式的理论知识固然重要,但 计算机程序的思维逻辑 (54) - 剖析 Collections - 设计模式 上节我们提到,类 Collections 中大概有两类功能,第一类是对容器接口对象进行操作,第二类是返回一个容器接口对象,上节我们介绍了...

    Dionysus_go 评论0 收藏0
  • php设计模式

    摘要:我们今天也来做一个万能遥控器设计模式适配器模式将一个类的接口转换成客户希望的另外一个接口。今天要介绍的仍然是创建型设计模式的一种建造者模式。设计模式的理论知识固然重要,但 计算机程序的思维逻辑 (54) - 剖析 Collections - 设计模式 上节我们提到,类 Collections 中大概有两类功能,第一类是对容器接口对象进行操作,第二类是返回一个容器接口对象,上节我们介绍了...

    vspiders 评论0 收藏0
  • 编程中的那些套路——关于察者模式

    摘要:我们应该写一段拓展性强与维护性较强的代码,由此衍生出观察者模式。 该文章属于《编程中的那些经典套路——设计模式汇总》系列,并且以下内容基于语言PHP 今天我们来谈谈观察者模式,这是一个经常用到的设计模式。 让我们想象一个场景:一个网站有不同等级区域的用户,不同等级的的用户登录后可以获得对应的服务(一级用户登录后获得一级服务,二级用户登录后获得二级服务,…以此类推)。那么我们如何写这段业...

    Fourierr 评论0 收藏0
  • php设计模式(1) 前言

    摘要:就像一群人完成某一项工作,不能一窝蜂全上,需要有组织有纪律,这个组织和纪律就是设计模式的概念。行为型设计模式用于在不同的对象之间管理算法关系以及职责结构型设计模式用于在不同的对象之间构造大的对象结构。 前言:php设计模式这个系列是基于我2012年的学习笔记,共11篇,结合近几年一些开发实践,也参考网上的一些高手的文章和视频,编辑整理而成,希望能给大家的帮助带来一些帮助。php设计模式...

    twohappy 评论0 收藏0
  • PHP 设计模式概述

    摘要:创建型模式主要有以下五种简单工厂模式和工厂方法模式抽象工厂模式单例模式建造者模式原型模式在设计模式一书中将工厂模式分为两类工厂方法模式与抽象工厂模式。 一、 设计模式(Design pattern)是什么 设计模式是一套被反复使用、多数人知晓、经过分类编目的代码设计的经验总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 二、 为什么会有设计模式 在软件开发过...

    IntMain 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<