设计模式之观察者模式(php实现)
2024-10-20 11:31:11
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/>';
最新文章
- web app iphone4 iphone5 iphone6 响应式布局 适配代码
- pysvn安装及常用方法
- Digital Imaging Processing 数字图像处理
- 【转】How to resolve ORA-19706 error when select from dblink
- 选择Web API还是WCF
- c++操作io常见命令
- AcmeAir安装AI探针--企业版
- [1.1]Knowledge that should be prepared
- elecworks 电缆型号管理器
- Android4.0 -- UI控件之 Menu 菜单的的使用(一)
- python学习随笔
- github的访问变慢了
- C# 求精简用一行代码完成的多项判断 重复赋值
- 35. leetcode 501. Find Mode in Binary Search Tree
- AspNet Core Api Restful +Swagger 实现微服务之旅 (三)
- window.open打开文件乱码
- 朱晔和你聊Spring系列S1E2:SpringBoot并不神秘
- git删除提交历史
- 【6】JMicro微服务-服务日志监控
- Redis缓存穿透、缓存雪崩、redis并发问题分析
热门文章
- PHP面向对象 封装与继承
- Redis键管理
- [洛谷P4656][CEOI2017]Palindromic Partitions
- transform perspective的层级问题
- reboot和init 6之间的区别
- HDU5187 zhx&#39;s contest
- [ CodeVS冲杯之路 ] P3038
- C++自带栈与队列_stack_queue_C++
- pycharm远程登录mysql
- 使用 Python 开始你的机器学习之旅【转】