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 ...
随机推荐
- UITableViewCell高度自适应探索--AutoLayout结合Frame
UITableViewCell高度自适应探索--UITableView+FDTemplateLayoutCell地址: http://www.jianshu.com/p/7839e3a273a6UIT ...
- hdfs: 数据流(二)
大部分的HDFS程序对文件操作需要的是一次写多次读取的操作模式. 一个文件一旦创建.写入.关闭之后就不需要修改了.这个假定简单化了数据一致的问题和并使高吞吐量的数据访问变得可能. 1. 读文件 从上图 ...
- South——谁说Django不能migrate!
零.前言 最近改一个项目,需要对已有的model进行更改.大家都知道Django自带的syncdb只能创建数据库,但是无法将已经改变的model应用的数据库中. 大概两年前遇到这个问题的时候,网上的答 ...
- python(3)-队列
队列分为双向队列和单向队列: 对于双向队列,同样需要先import collections 创建队列 >>> import collections >>> d = ...
- SQL_server 数据库备份信息查看
select distinct s.database_name, s.first_lsn,s.last_lsn,s.database_backup_lsn,s.backup_finish_date,s ...
- 关于hkcmd.exe造成的和Eclipse之间热键冲突
可能是自己新买的笔记本比较强大,显卡也比较牛叉.当使用一些常用的Eclipse快捷键的时候Eclipse本身没有反应,反而显示器有了反应. 经常用的Eclispse中的快捷键Ctrl+Alt+↑ 和C ...
- [未完成]关于POI的使用
关于POI的使用关于POI的使用关于POI的使用关于POI的使用
- MSP430常见问题之FLASH存储类
Q1:用IAR Embedded Workbench for MSP430 通过JTAG往MSP430上写程序.为了知道片内程序的版本,必须读出Flash 中内容.什么工具软件可以通过JTAG口实现这 ...
- poj 2524 Ubiquitous Religions(宗教信仰)
Ubiquitous Religions Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 30666 Accepted: ...
- 转:传入的表格格式数据流(TDS)远程过程调用(RPC)协议流不正确 .
近期在做淘宝客的项目,大家都知道,淘宝的商品详细描述字符长度很大,所以就导致了今天出现了一个问题 VS的报错是这样子的 ” 传入的表格格式数据流(TDS)远程过程调用(RPC)协议流不正确“ 还说某 ...