设计模式之观察者模式(php实现)
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实现)的更多相关文章
- 乐在其中设计模式(C#) - 观察者模式(Observer Pattern)
原文:乐在其中设计模式(C#) - 观察者模式(Observer Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 观察者模式(Observer Pattern) 作者:weba ...
- 设计模式之观察者模式(Observable与Observer)
设计模式之观察者模式(Observable与Observer) 好久没有写博客啦,之前看完了<设计模式之禅>也没有总结一下,现在回忆一下设计模式之观察者模式. 1.什么是观察者模式 简单情 ...
- 8.5 GOF设计模式四: 观察者模式Observer
GOF设计模式四: 观察者模式Observer 现实中遇到的问题 当有许多不同的客户都对同一数据源感兴趣,对相同的数据有不同的处理方式,该如 何解决?5.1 定义: 观察者模式 观察者模式 ...
- php 设计模式之观察者模式(订阅者模式)
php 设计模式之观察者模式 实例 没用设计模式的代码,这样的代码要是把最上面那部分也要符合要求加进来,就要修改代码,不符合宁增不改的原则 介绍 观察者模式定义对象的一对多依赖,这样一来,当一个对象改 ...
- [JS设计模式]:观察者模式(即发布-订阅者模式)(4)
简介 观察者模式又叫发布---订阅模式,它定义了对象间的一种一对多的关系,让多个观察者对象同时监听某一个主题对象,当一个对象发生改变时,所有依赖于它的对象都将得到通知. 举一个现实生活中的例子,例如小 ...
- 实践GoF的23种设计模式:观察者模式
摘要:当你需要监听某个状态的变更,且在状态变更时通知到监听者,用观察者模式吧. 本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:观察者模式>,作者: 元闰子 . 简介 现在有 ...
- java设计模式之观察者模式
观察者模式 观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式.模型-视图(View)模式.源-收听者(Listener)模式或从属者模式)是软件设计模式的一种.在此种模 ...
- [python实现设计模式]-4.观察者模式-吃食啦!
观察者模式是一个非常重要的设计模式. 我们先从一个故事引入. 工作日的每天5点左右,大燕同学都会给大家订饭. 然后7点左右,饭来了. 于是燕哥大吼一声,“饭来啦!”,5点钟定过饭的同学就会纷纷涌入餐厅 ...
- 【GOF23设计模式】观察者模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_观察者模式.广播机制.消息订阅.网络游戏对战原理 package com.test.observer; import ja ...
- 设计模式学习——观察者模式(Observer Pattern)
0. 前言 观察者模式在许多地方都能够用到,特别是作为MVC模式的一部分,在MVC中,模型(M):存放数据,视图(V):显示数据.当模型中的数据发生改变时,视图会得到通知,这是典型的观察者模式. 1. ...
随机推荐
- 雅礼集训 Day1 T2 折射
折射 题目描述 小\(\mathrm{Y}\)十分喜爱光学相关的问题,一天他正在研究折射. 他在平面上放置了\(n\)个折射装置,希望利用这些装置画出美丽的折线. 折线将从某个装置出发,并且在经过一处 ...
- JSON.stringify与jQuery.parseJSON
1.JSON.stringify,这个函数的作用主要是为了系列化对象的.(或者说是将原来的对象转换为字符串的,如json对象): 首先定义一个json对象,var jsonObject = { &qu ...
- 货车运输(LCA+最大生成树)
神奇传送门 恩,这是一道神奇的LCA+难度的题目. 题目是这样的: A 国有n座城市,编号从1到n,城市之间有 m条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q辆货车在运输货物,司机们 ...
- snmp 默认团体名检测利用
[root@izj6c2n1nth4tg8emd8h58z tmp]# lsb_release LSB Version: :core-4.1-amd64:core-4.1-noarch[root ...
- QT5.3.1 Quick 开发 --- 项目类型的选择(转)
原文转自 https://www.cnblogs.com/aoldman/p/3966025.html 作为一个转行QT开发的新手,面对基于QML的开发时候 看到很多的项目类型感到很困惑,不知道应该怎 ...
- linux.backspace乱码(转)
42 linux.backspace乱码 linux环境sqlplus中使用backspace键出现乱码的解决方法2008-04-30 16:32 在linux环境下使用sqlplus,在回删(bac ...
- Daemon Process
Daemon Process 守护进程(Daemon)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待 处理某些发生的事件.守护进程是一种很有用的进程. Lin ...
- 菜单栏选中时CSS3过渡效果
(如有错敬请指点,以下是我工作中遇到并且解决的问题) 效果图: 未点击时: 点击后: HTML代码: <ul> <li class="active">菜单1 ...
- mysql-MHA 故障收集
在manager 主机上开启监控服务,启动不了 [root@manager ~]# managerStart [] [root@manager ~]# managerStatus app1 is st ...
- Centos7下yum安装mongodb
简介 MongoDB 是一个基于分布式 文件存储的NoSQL数据库 由C++语言编写,运行稳定,性能高 旨在为 WEB 应用提供可扩展的高性能数据存储解决方案 查看官方网站 MongoDB特点 模式自 ...