github地址:https://github.com/ZQCard/design_pattern
/**
* 当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。
* 比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。
* 一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。
*/

(1) Subject.class.php(目标类)

<?php

namespace Observer;

class Subject
{
private $state; private $observers = []; public function getState()
{
return $this->state;
} public function seState($state)
{
$this->state = $state;
$this->notifyAllObjects();
} public function register(Observer $object)
{
$this->observers[] = $object;
} public function remove($object)
{
foreach ($this->observers as $key => $observer) {
if ($observer == $object){
unset($this->observers[$key]);
}
}
} public function notifyAllObjects()
{
foreach ($this->observers as $observer) {
$observer->update();
}
}
}

(2)Observer.class.php(观察者抽象父类)

<?php

namespace Observer;

abstract class Observer
{
protected $subject; public abstract function update();
}

(3)ObjectA.class.php (具体抽象类A)

<?php

namespace Observer;

class ObserverA extends Observer
{
private $myState = 'init A'; public function __construct(Subject $subject)
{
$this->subject = $subject;
$this->subject->register($this);
} public function update()
{
$this->myState = $this->subject->getState();
} public function getSate()
{
return "ObserverA get state:".$this->myState;
}
}

(4)ObserverB.class.php(具体观察者B)

<?php

namespace Observer;

class ObserverB extends Observer
{
private $myState = 'init B'; public function __construct(Subject $subject)
{
$this->subject = $subject;
$this->subject->register($this);
} public function update()
{
$this->myState = $this->subject->getState();
} public function getSate()
{
return "ObserverB get state:".$this->myState;
}
}

(5)observer.php

<?php

spl_autoload_register(function ($className){
$className = str_replace('\\','/',$className);
include $className.".class.php";
}); use Observer\ObserverA;
use Observer\ObserverB;
use Observer\Subject;
/*
ObserverA get state:init A
ObserverB get state:init B
ObserverA get state:hello
ObserverB get state:hello
*/
$subject = new Subject(); $objectA = new ObserverA($subject); $objectB = new ObserverB($subject); echo $objectA->getSate(); echo '<br/>'; echo $objectB->getSate(); echo '<br/>'; $subject->seState("hello"); echo $objectA->getSate(); echo '<br/>'; echo $objectB->getSate(); echo '<br/>';

设计模式之观察者模式(php实现)的更多相关文章

  1. 乐在其中设计模式(C#) - 观察者模式(Observer Pattern)

    原文:乐在其中设计模式(C#) - 观察者模式(Observer Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 观察者模式(Observer Pattern) 作者:weba ...

  2. 设计模式之观察者模式(Observable与Observer)

    设计模式之观察者模式(Observable与Observer) 好久没有写博客啦,之前看完了<设计模式之禅>也没有总结一下,现在回忆一下设计模式之观察者模式. 1.什么是观察者模式 简单情 ...

  3. 8.5 GOF设计模式四: 观察者模式Observer

    GOF设计模式四: 观察者模式Observer  现实中遇到的问题  当有许多不同的客户都对同一数据源感兴趣,对相同的数据有不同的处理方式,该如 何解决?5.1 定义: 观察者模式  观察者模式 ...

  4. php 设计模式之观察者模式(订阅者模式)

    php 设计模式之观察者模式 实例 没用设计模式的代码,这样的代码要是把最上面那部分也要符合要求加进来,就要修改代码,不符合宁增不改的原则 介绍 观察者模式定义对象的一对多依赖,这样一来,当一个对象改 ...

  5. [JS设计模式]:观察者模式(即发布-订阅者模式)(4)

    简介 观察者模式又叫发布---订阅模式,它定义了对象间的一种一对多的关系,让多个观察者对象同时监听某一个主题对象,当一个对象发生改变时,所有依赖于它的对象都将得到通知. 举一个现实生活中的例子,例如小 ...

  6. 实践GoF的23种设计模式:观察者模式

    摘要:当你需要监听某个状态的变更,且在状态变更时通知到监听者,用观察者模式吧. 本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:观察者模式>,作者: 元闰子 . 简介 现在有 ...

  7. java设计模式之观察者模式

    观察者模式 观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式.模型-视图(View)模式.源-收听者(Listener)模式或从属者模式)是软件设计模式的一种.在此种模 ...

  8. [python实现设计模式]-4.观察者模式-吃食啦!

    观察者模式是一个非常重要的设计模式. 我们先从一个故事引入. 工作日的每天5点左右,大燕同学都会给大家订饭. 然后7点左右,饭来了. 于是燕哥大吼一声,“饭来啦!”,5点钟定过饭的同学就会纷纷涌入餐厅 ...

  9. 【GOF23设计模式】观察者模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_观察者模式.广播机制.消息订阅.网络游戏对战原理 package com.test.observer; import ja ...

  10. 设计模式学习——观察者模式(Observer Pattern)

    0. 前言 观察者模式在许多地方都能够用到,特别是作为MVC模式的一部分,在MVC中,模型(M):存放数据,视图(V):显示数据.当模型中的数据发生改变时,视图会得到通知,这是典型的观察者模式. 1. ...

随机推荐

  1. 201621123034 《Java程序设计》第10周学习总结

    作业10-异常 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 1. 常用异常 结合题集题目7-1回答 1.1 自己以前编写 ...

  2. CodeForces Round #515 Div.3 A. Vova and Train

    http://codeforces.com/contest/1066/problem/A Vova plans to go to the conference by train. Initially, ...

  3. Ajax---概念介绍

    Ajax不是某种编程语言,是一种在无需重新加载整个网页的情况下能够更新部分网页的技术. 运用HTML和CSS来实现页面,表达信息: 运用XMLHttpRequest和Web服务器进行数据的异步交换: ...

  4. js中prop和attr区别

    首先 attr 是从页面搜索获得元素值,所以页面必须明确定义元素才能获取值,相对来说比较慢. 如: <input name='test' type='checkbox'> $('input ...

  5. 【CF Round 439 E. The Untended Antiquity】

    time limit per test 2 seconds memory limit per test 512 megabytes input standard input output standa ...

  6. 提取URL字符串的搜索字符串中的参数

    function urlArgs() { var args = []; var query = location.search.substring(1); var paris = query.spli ...

  7. COM RTS/CTS, DTR/DSR

    COM: 串行通讯端口cluster communication port它是串行接口,现在的PC 机一般有两个串行口COM 1 和COM 2 .串行口不同于并行口之处在于它的数据和控制信息是一位接一 ...

  8. 汕头市队赛 SRM1X T2 ——扫描线

    绵津见-终 SRM 13 背景 “西瓜也是可以种在海上的!”——绵津见 然而种在海上的西瓜最需要防范的,是时不时会涌向瓜田的阵阵海浪. 幸好,身为海神的绵津见可以释放魔法“水平如镜”来阻止海浪拍打西瓜 ...

  9. python--optparse

    import optparse op = optparse.OptionParser() op.add_option("--s", dest="server") ...

  10. gitlib 安装

    参考文件https://www.cnblogs.com/rslai/p/9109624.html