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 ...
随机推荐
- [转载]BigPipe技术
1. 技术背景 FaceBook页面加载技术 试想这样一个场景,一个经常访问的网站,每次打开它的页面都要要花费6 秒:同时另外一个网站提供了相似的服务,但响应时间只需3 秒,那么你会如何选择呢?数据表 ...
- Autowired properities class
1. Properties类 @ConfigurationProperties(locations = "classpath:build.properties") @JsonInc ...
- LeetCode 42
Trapping Rain Water Given n non-negative integers representing an elevation map where the width of e ...
- poj 2823 单调队列
思路:裸的单调队列. #include<iostream> #include<cstring> #include<cstdio> #include<algor ...
- 虚拟机 VirtualBox 自制帮助文档
初学 VirtualBox ,网络上教程很多,图片一张一张的费流量,讲得又比较散,于是花了一下午制作了此 CHM 帮助文档. 下载:(图片另存为--重命名为 RhinoC.rar --解压缩)
- nmap命令-----高级用法
探测主机存活常用方式 (1)-sP :进行ping扫描 打印出对ping扫描做出响应的主机,不做进一步测试(如端口扫描或者操作系统探测): 下面去扫描10.0.3.0/24这个网段的的主机 nmap ...
- H5-xhtml+css2-静态百度首页练习
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- CXF(2.7.10) - WSDL2Java generated Client
以调用 http://www.webxml.com.cn/ 提供的 IpAddressSearchWebService 服务为例. 1. 使用 wsdl2java 工具,根据 wsdl 生成 JAX- ...
- Git - Eclipse 提交工程至 GitHub
1. 在 GitHub 新建一个工程 hello-world,repository 地址是 https://github.com/username/hello-world.git 2. 在 Eclip ...
- xml使用系统整理
1. 认识xml 可扩展标记语言,一种用于标记电子文档使其具有结果性的标记语言,它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言. 2. 和超文本标记语言区别 2.1 ...