Review PHP设计模式之——观测模式
观测模式:
<?php
class car implements SplSubject{
private $carName; //车的类型
private $carState=0; //车的状态,0为关闭,1这启动车子
private $carSpeed=0; //初始化车的速度表值
private $Observers; //各项车的性能观察对象 public function __construct($Name){
$this->carName=$Name;
$this->Observers=new SplObjectStorage;
} //启动
public function start(){
$this->carState=1;
$this->notify();
} //停车
public function stop(){
$this->carState=0;
$this->carSpeed=0;
$this->notify();
} //加速
public function accelerate($Acceleration){
if(0===$this->carState){
throw new Exception('Please start!');
}
if(!is_int($Acceleration) || $Acceleration<0){
throw new Exception('The value of acceleration is invalid!');
}
$this->carSpeed+=$Acceleration;
$this->notify();
} //增加监测对象
public function attach(SplObserver $observer){
if(!$this->Observers->contains($observer)){
$this->Observers->attach($observer);
}
return true;
} //删除监测对象
public function detach(SplObserver $observer){
if(!$this->Observers->contains($observer)){
return false;
}
$this->Observers->detach($observer);
return true;
} //传送对象
public function notify(){
foreach($this->Observers as $observer){
$observer->update($this);
}
} public function __get($Prop){
switch($Prop){
case 'STATE':
return $this->carState;
break;
case 'SPEED':
return $this->carSpeed;
break;
case 'NAME':
return $this->carName;
break;
default:
throw new Exception($Prop.'can not be read');
}
} public function __set($Prop,$Val){
throw new Exception($Prop.'can not be set');
}
} class carStateObserver implements SplObserver{
private $SubjectState;
public function update(SplSubject $subject){
switch($subject->STATE){
case 0:
if(is_null($this->SubjectState)){
echo $subject->NAME.' not started'."\n";
}else{
echo $subject->NAME.' stalling of engine'."\n";
}
$this->SubjectState=0;
break;
case 1:
if(1!==$this->SubjectState){
echo $subject->NAME.' is starting'."\n";
$this->SubjectState=1;
}
break;
default:
throw new Exception('Unexpected error in carStateObserver::update()');
}
}
} class carSpeedObserver implements SplObserver{
public function update(SplSubject $subject){
if(0!==$subject->STATE){
echo $subject->NAME.' current speed is '.$subject->SPEED.'Kmh'."\n";
}
}
} class carOverspeedObserver implements SplObserver{
public function update(SplSubject $subject){
if($subject->SPEED>130){
throw new Exception('The max speed is 130, you are breaking up!'."\n");
}
}
} try{
$driver = new car('AUDIA4');
$driver->attach(new carStateObserver);
$driver->attach(new carSpeedObserver);
$driver->attach(new carOverspeedObserver);
$driver->start();
$driver->accelerate(10);
$driver->accelerate(30);
$driver->stop();
$driver->start();
$driver->accelerate(50);
$driver->accelerate(70);
$driver->accelerate(100);
$driver->accelerate(150);
}
catch(Exception$e){
echo $e->getMessage();
}
?>
Review PHP设计模式之——观测模式的更多相关文章
- Review PHP设计模式之——注册模式
注册模式: class DbConnections{ var $_store = array(); public function isValid($key) { return isset($this ...
- 每天一个设计模式-7 生成器模式(Builder)
每天一个设计模式-7 生成器模式(Builder) 一.实际问题 在讨论工厂方法模式的时候,提到了一个导出数据的应用框架,但是并没有涉及到导出数据的具体实现,这次通过生成器模式来简单实现导出成文本,X ...
- 每天一个设计模式-2 外观模式(Facade)
每天一个设计模式-2 外观模式(Facade) 1.生活中的示例 客户想要购买一台电脑,一般有两种方法: 1.自己DIY,客户需要知道组成电脑的所有电子器件,并且需要熟悉那些配件,对客户要求较高. ...
- Java设计模式之建造者模式(Builder)
前言: 最近一直在学习okHttp,也对其做了一些整理,okHttp和Retrofit结合大大加速我们的开发效率,源码里面采用了很多设计模式,今天我们来学习一下其中的设计模式之一建造者模式. 建造者模 ...
- [Head First设计模式]云南米线馆中的设计模式——模版方法模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...
- 设计模式——抽象工厂模式及java实现
设计模式--抽象工厂模式及java实现 设计模式在大型软件工程中很重要,软件工程中采用了优秀的设计模式有利于代码维护,方便日后更改和添加功能. 设计模式有很多,而且也随着时间在不断增多,其中最著名的是 ...
- 设计模式-14 MVC模式
一 MVC设计模式 MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式,它是一个存在于服务器 表达层的模型,它将应用分开,改变应用之间的高度耦合 MVC设计模式将 ...
- 设计模式_11_原型模式(prototype)深拷贝、浅拷贝
设计模式_11_原型模式(prototype) 浅拷贝: package designPatternOf23; /** * 定义:用原型实例,指定创建对象的种类,并通过拷贝这些原型创建新的对象 * P ...
- 17. 星际争霸之php设计模式--职责链模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
随机推荐
- Innode引擎监控的开启的方法
查看当前InnoDB引擎信息 mysql> show innodb status\G 开启InnoDB监控,有四种: 1. innodb_monitor mysql> create tab ...
- 利用 Composer 一步一步构建自己的 PHP 框架(三)——设计 MVC
终于可以 “一次编写,到处发布” 了,泪流满面! 今天凌晨我从一点多开始搞了四个小时到 5:20,终于搞出了个 Emlog 的 MarkDown 插件!欢迎 Emloger 尝试! 本教程示例代码见 ...
- 小白日记31:kali渗透测试之Web渗透-扫描工具-Arachni
扫描工具-Arachni Kali中集成旧的arachni的阉割版,所以需要重新安装[在某些方面有其独特性,但不算很强大,有命令行和web两种使用方式][匿名者推荐] apt-get update h ...
- python之装饰器详解
这几天翻看python语法,看到装饰器这里着实卡了一阵,最初认为也就是个函数指针的用法,但仔细研究后发现,不止这么简单. 首先很多资料将装饰器定义为AOP的范畴,也就是Aspect Oriented ...
- 快递鸟电子面单API对接方法?
之前说了一下快递公司.菜鸟和快递鸟的电子面单接口,很多人不知道快递鸟要怎么对接,现在为大家讲解一下.快递鸟是全球物流接口服务商,为电商 ERP.电商平台.仓储.清关公司提供物流跟踪.电子面单.智选物流 ...
- font拓展字体
最近接触了一个将字体拓展的方法,感觉很不错,所以积累一下. 最近接触的项目一直再用antd,它本身已经提供了很多图标,但是依然不够用,所以需要我们拓展出来一些. 当我们下载到本地之后,就会有几个文件, ...
- Java 8: Lambdas和新的集合Stream API
Lambda是Java8的主要特色,Java 8: Lambdas & Java Collections | zeroturnaround.com一文介绍了使用Lambda集合处理大量数据的方 ...
- JSONP与JSON的关系
这篇文章<说说JSON和JSONP,也许你会豁然开朗>写得非常棒,推荐一下 http://kb.cnblogs.com/page/139725/ (大神,对不起,我记录一下,因为你写的真得 ...
- coherence配置说明
经过上篇 coherence初识 ,最近算是和coherence杠上了,针对coherence3.5.3这个版本,把学到的东西整理下 1. 这个jar包有点大,4M多,首先打开coherence.ja ...
- 使用AccessibilityService模拟点击事件失败的分析
使用AccessibilityService模拟点击事件的方法: AccessibilityNodeInfo.performAction(AccessibilityNodeInfo.ACTION_CL ...