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 ...
随机推荐
- Linux shell 脚本攻略之统计文件的行数、单词数和字符数
摘自:<Linux shell 脚本攻略>
- Android(java)学习笔记108:通过反射获取私有构造方法并且使用
反射获取私有构造方法并且使用: 1.获取字节码文件.class对象: Class c = Class.forName("cn.itcast_01.Person") ...
- [转]T4模版引擎之生成数据库实体类
本文转自:http://www.cnblogs.com/lzrabbit/archive/2012/07/18/2597953.html 在通过T4模版引擎之基础入门 对T4有了初步印象后,我们开始实 ...
- CF Error Correct System
Error Correct System time limit per test 2 seconds memory limit per test 256 megabytes input standar ...
- HDU 1978 How many ways (DP)
How many ways Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- Servlet & JSP - getParameter 与 request.getAttribute 的区别
getParameter 方法获取的是表单或 URL 的请求参数.参数是从 Web 客户端传递至 Web 服务端.例如有如下的 servlet: @WebServlet(name = "he ...
- 【转】Log4.NET mark
C#通过log4net进行异常记录 C#中异常的记录也有一个模板,就是log4net.多的就不说了直接看怎么用的吧. 1.引用log4net.dll. 2.实现log4net的方法. public c ...
- 转:SqlServer2008误操作数据(delete或者update)后恢复数据
Sqlserver2008误操作数据(delete或者update)后恢复数据(转) 实际工作中,有时会直接在数据库中操作数据,比如对数据进行delete或者update操作,当进行这些操作的时候,如 ...
- SQLSERVER2012数据库还原
(1)还原已存在数据库 还原时提示失败,因为数据库正在使用,无法获得独占访问权.解决办法,先分离已存在的数据库,再执行还原操作. 确定后居然成功了,因为我是先使用(2)还原数据库后直接尝试(1)方法还 ...
- 牢记!SQL Server数据库开发的二十一条注意点
如果你正在负责一个基于SQL Server的项目,或者你刚刚接触SQL Server,你都有可能要面临一些数据库性能的问题,这篇文章会为你提供一些有用的指导(其中大多数也可以用于其它的DBMS). ...