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/>';

最新文章

  1. web app iphone4 iphone5 iphone6 响应式布局 适配代码
  2. pysvn安装及常用方法
  3. Digital Imaging Processing 数字图像处理
  4. 【转】How to resolve ORA-19706 error when select from dblink
  5. 选择Web API还是WCF
  6. c++操作io常见命令
  7. AcmeAir安装AI探针--企业版
  8. [1.1]Knowledge that should be prepared
  9. elecworks 电缆型号管理器
  10. Android4.0 -- UI控件之 Menu 菜单的的使用(一)
  11. python学习随笔
  12. github的访问变慢了
  13. C# 求精简用一行代码完成的多项判断 重复赋值
  14. 35. leetcode 501. Find Mode in Binary Search Tree
  15. AspNet Core Api Restful +Swagger 实现微服务之旅 (三)
  16. window.open打开文件乱码
  17. 朱晔和你聊Spring系列S1E2:SpringBoot并不神秘
  18. git删除提交历史
  19. 【6】JMicro微服务-服务日志监控
  20. Redis缓存穿透、缓存雪崩、redis并发问题分析

热门文章

  1. PHP面向对象 封装与继承
  2. Redis键管理
  3. [洛谷P4656][CEOI2017]Palindromic Partitions
  4. transform perspective的层级问题
  5. reboot和init 6之间的区别
  6. HDU5187 zhx&#39;s contest
  7. [ CodeVS冲杯之路 ] P3038
  8. C++自带栈与队列_stack_queue_C++
  9. pycharm远程登录mysql
  10. 使用 Python 开始你的机器学习之旅【转】