学习php设计模式 php实现观察者模式(Observer)_php技巧

一、意图
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新【GOF95】
又称为发布-订阅(Publish-Subscribe)模式、模型-视图(Model-View)模式、源-监听(Source-Listener)模式、或从属者(Dependents)模式
二、观察者模式结构图

 

三、观察者模式中主要角色
抽象主题(Subject)角色:主题角色将所有对观察者对象的引用保存在一个集合中,每个主题可以有任意多个观察者。抽象主题提供了增加和删除观察者对象的接口。
抽象观察者(Observer)角色:为所有的具体观察者定义一个接口,在观察的主题发生改变时更新自己。
具体主题(ConcreteSubject)角色:存储相关状态到具体观察者对象,当具体主题的内部状态改变时,给所有登记过的观察者发出通知。具体主题角色通常用一个具体子类实现。
具体观察者(ConcretedObserver)角色:存储一个具体主题对象,存储相关状态,实现抽象观察者角色所要求的更新接口,以使得其自身状态和主题的状态保持一致。
四、观察者模式的优点和缺点
观察者模式的优点:
1、观察者和主题之间的耦合度较小;
2、支持广播通信;
观察者模式的缺点:
1、由于观察者并不知道其它观察者的存在,它可能对改变目标的最终代价一无所知。这可能会引起意外的更新。
五、观察者模式适用场景
1、当一个抽象模型有两个方面,其中一个方面依赖于另一个方面。
2、当对一个对象的改变需要同时改变其它对象,而不知道具体有多少个对象待改变。
3、当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换句话说,你不希望这些对象是紧密耦合的。
六、观察者模式与其它模式
中介者模式(Mediator):通过封装复杂的更新语义,ChangeManager充当目标和观察者之间的中介者。
单例模式(singleton模式):ChangeManager可使用Singleton模式来保证它是唯一的并且是可全局访问的。
七、观察者模式PHP示例

<?php
/**
 * 抽象主题角色
 */
interface Subject {

  /**
   * 增加一个新的观察者对象
   * @param Observer $observer
   */
  public function attach(Observer $observer);

  /**
   * 删除一个已注册过的观察者对象
   * @param Observer $observer
   */
  public function detach(Observer $observer);

  /**
   * 通知所有注册过的观察者对象
   */
  public function notifyObservers();
}

/**
 * 具体主题角色
 */
class ConcreteSubject implements Subject {

  private $_observers;

  public function __construct() {
    $this->_observers = array();
  }

  /**
   * 增加一个新的观察者对象
   * @param Observer $observer
   */
  public function attach(Observer $observer) {
    return array_push($this->_observers, $observer);
  }

  /**
   * 删除一个已注册过的观察者对象
   * @param Observer $observer
   */
  public function detach(Observer $observer) {
    $index = array_search($observer, $this->_observers);
    if ($index === FALSE || ! array_key_exists($index, $this->_observers)) {
      return FALSE;
    }

    unset($this->_observers[$index]);
    return TRUE;
  }

  /**
   * 通知所有注册过的观察者对象
   */
  public function notifyObservers() {
    if (!is_array($this->_observers)) {
      return FALSE;
    }

    foreach ($this->_observers as $observer) {
      $observer->update();
    }

    return TRUE;
  }

}

/**
 * 抽象观察者角色
 */
interface Observer {

  /**
   * 更新方法
   */
  public function update();
}

class ConcreteObserver implements Observer {

  /**
   * 观察者的名称
   * @var <type>
   */
  private $_name;

  public function __construct($name) {
    $this->_name = $name;
  }

  /**
   * 更新方法
   */
  public function update() {
    echo 'Observer', $this->_name, ' has notified.<br />';
  }

}

/**
 * 客户端
 */
class Client {

  /**
   * Main program.
   */
  public static function main() {
    $subject = new ConcreteSubject();

    /* 添加第一个观察者 */
    $observer1 = new ConcreteObserver('Martin');
    $subject->attach($observer1);

    echo '<br /> The First notify:<br />';
    $subject->notifyObservers();

    /* 添加第二个观察者 */
    $observer2 = new ConcreteObserver('phppan');
    $subject->attach($observer2);

    echo '<br /> The Second notify:<br />';
    $subject->notifyObservers();

    /* 删除第一个观察者 */
    $subject->detach($observer1);

    echo '<br /> The Third notify:<br />';
    $subject->notifyObservers();
  }

}

Client::main();
?>

以上就是使用php实现观察者模式的代码,还有一些关于观察者模式的概念区分,希望对大家的学习有所帮助。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索php
, 设计模式
观察者模式
,以便于您获取更多的相关知识。

时间: 2024-10-29 08:56:43

学习php设计模式 php实现观察者模式(Observer)_php技巧的相关文章

学习php设计模式 php实现建造者模式_php技巧

建造者模式可以让一个产品的内部表象和和产品的生产过程分离开,从而可以生成具有不同内部表象的产品.一.Builder模式结构图   二.Builder模式中主要角色抽象建造者(Builder)角色:定义一个抽象接口,规范产品各个组成成分的建造(即规范具体建造者的方法实现).其中所规范的方法中必须包括建造方法和结果返回方法具体建造者(ConcreteBuilder)角色:实现抽象建造者角色所定义的方法.具体建造者与业务逻辑关联性较大,应用程序最终会通过调用此角色中所实现的建造方法按照业务逻辑创建产品

学习php设计模式 php实现状态模式_php技巧

一.意图 允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类 状态模式变化的位置在于对象的状态 二.状态模式结构图   三.状态模式中主要角色抽象状态(State)角色:定义一个接口,用以封装环境对象的一个特定的状态所对应的行为 具体状态(ConcreteState)角色:每一个具体状态类都实现了环境(Context)的一个状态所对应的行为 环境(Context)角色:定义客户端所感兴趣的接口,并且保留一个具体状态类的实例.这个具体状态类的实例给出此环境对象的现有状态四.状态

学习php设计模式 php实现模板方法模式_php技巧

一.意图 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.Template Method 使得子类可以在不改变一个算法的结构的情况下重定义该算法的某些特定的步骤[GOF95]二.模板方法模式结构图 三.模板方法模式中主要角色抽象模板(AbstractClass)角色: 定义一个或多个抽象方法让子类实现.这些抽象方法叫做基本操作,它们是顶级逻辑的组成部分. 定义一个模板方法.这个模板方法一般是一个具体方法,它给出顶级逻辑的骨架,而逻辑的组成步骤在对应的抽象操作中,这些操作将会推迟到子类中实现

设计模式 ( 十六 ) 观察者模式Observer(对象行为型)

设计模式 ( 十五 ) 观察者模式Observer(对象行为型)    1.概述 一些面向对象的编程方式,提供了一种构建对象间复杂网络互连的能力.当对象们连接在一起时,它们就可以相互提供服务和信息. 通常来说,当某个对象的状态发生改变时,你仍然需要对象之间能互相通信.但是出于各种原因,你也许并不愿意因为代码环境的改变而对代码做大的修改.也许,你只想根据你的具体应用环境而改进通信代码.或者,你只想简单的重新构造通信代码来避免类和类之间的相互依赖与相互从属. 2.问题 当一个对象的状态发生改变时,你

学习JavaScript设计模式之装饰者模式_javascript技巧

有时我们不希望某个类天生就非常庞大,一次性包含许多职责.那么我们就可以使用装饰着模式. 装饰着模式可以动态地给某个对象添加一些额外的职责,从而不影响这个类中派生的其他对象. 装饰着模式将一个对象嵌入另一个对象之中,实际上相当于这个对象被另一个对象包装起来,形成一条包装链. 一.不改动原函数的情况下,给该函数添加些额外的功能 1. 保存原引用 window.onload = function() { console.log(1); }; var _onload = window.onload ||

学习JavaScript设计模式之责任链模式_javascript技巧

一.定义 责任链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 二.示例 假设这么一个场景: 我们负责一个售卖手机的电商网站,经过分别缴纳500元定金和200元定金的两轮预定后,到了正式购买阶段.针对预定用户实行优惠,支付过500元定金的用户会收到100元的商城优惠券,支付过200元定金的用户会收到50元的商城优惠券,没有支付定金的用户归为普通购买,且在库存有限的情况下不一定保证买到. /*

php设计模式之单例模式实例分析_php技巧

本文实例讲述了php设计模式之单例模式.分享给大家供大家参考.具体分析如下: 单例模式(职责模式): 简单的说,一个对象(在学习设计模式之前,需要比较了解面向对象思想)只负责一个特定的任务: 单例类: 1.构造函数需要标记为private(访问控制:防止外部代码使用new操作符创建对象),单例类不能在其他类中实例化,只能被其自身实例化: 2.拥有一个保存类的实例的静态成员变量 3.拥有一个访问这个实例的公共的静态方法(常用getInstance()方法进行实例化单例类,通过instanceof操

PHP设计模式之装饰者模式_php技巧

介绍 装饰者模式动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更有弹性的替代方案. 思维导图   有这样一个项目,做一个餐厅订餐系统.起初的代码结构是这样的.前面有很多Beverage的继承类,现在遇到的问题是牛奶的价钱上涨了,那么所有相关的类,我们都要进行调整,比如Milk,SugarAndMilk类,这种类还有很多,我们需要逐个去修改类中的方法--开发人员每次都做这种事情,要疯了!所以我们要改变现有的结构.以下的图都是简图,实际的图,可没有这么简单.      设计问题: 1>类

PHP学习之数组的定义和填充_php技巧

PHP的数组,说白了,就是关联数据每一条数组都是以[索引,值]的形式保存的.其中索引默认是以0开始的数字.在未指定索引时,PHP会从0开始自动生成索引.当指定一个索引,PHP会从你指定索引最大正整数的下一个整数开始.如果你指定的是小数,PHP会取整数部分做为索引. 另外说说数组其它一些小东西: array()可以声明一个空数组: array[] = $value 在数组存在时,追加一个数据:在数组不存时,生成一个数组,并追加数据. array[$index] = $value 在数组存在时,追加