观测模式:

 <?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设计模式之——观测模式的更多相关文章

  1. Review PHP设计模式之——注册模式

    注册模式: class DbConnections{ var $_store = array(); public function isValid($key) { return isset($this ...

  2. 每天一个设计模式-7 生成器模式(Builder)

    每天一个设计模式-7 生成器模式(Builder) 一.实际问题 在讨论工厂方法模式的时候,提到了一个导出数据的应用框架,但是并没有涉及到导出数据的具体实现,这次通过生成器模式来简单实现导出成文本,X ...

  3. 每天一个设计模式-2 外观模式(Facade)

    每天一个设计模式-2  外观模式(Facade) 1.生活中的示例 客户想要购买一台电脑,一般有两种方法: 1.自己DIY,客户需要知道组成电脑的所有电子器件,并且需要熟悉那些配件,对客户要求较高. ...

  4. Java设计模式之建造者模式(Builder)

    前言: 最近一直在学习okHttp,也对其做了一些整理,okHttp和Retrofit结合大大加速我们的开发效率,源码里面采用了很多设计模式,今天我们来学习一下其中的设计模式之一建造者模式. 建造者模 ...

  5. [Head First设计模式]云南米线馆中的设计模式——模版方法模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...

  6. 设计模式——抽象工厂模式及java实现

    设计模式--抽象工厂模式及java实现 设计模式在大型软件工程中很重要,软件工程中采用了优秀的设计模式有利于代码维护,方便日后更改和添加功能. 设计模式有很多,而且也随着时间在不断增多,其中最著名的是 ...

  7. 设计模式-14 MVC模式

    一 MVC设计模式 MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式,它是一个存在于服务器 表达层的模型,它将应用分开,改变应用之间的高度耦合 MVC设计模式将 ...

  8. 设计模式_11_原型模式(prototype)深拷贝、浅拷贝

    设计模式_11_原型模式(prototype) 浅拷贝: package designPatternOf23; /** * 定义:用原型实例,指定创建对象的种类,并通过拷贝这些原型创建新的对象 * P ...

  9. 17. 星际争霸之php设计模式--职责链模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

随机推荐

  1. Linux 下memcache安装及使用

    memcache是高性能,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度.据说官方所说,其用户包括twitter.digg.flickr等,都是些互联网大腕呀.目前用memca ...

  2. 使用hibernate自动创建Mysql表失败原因

    1.使用 schemaExport(hibernate5.2.3)创建Mysql表 @Test public void testSchemaExport() { ServiceRegistry ser ...

  3. Message Decoding

    Some message encoding schemes require that an encoded message be sent in two parts. The first part, ...

  4. Objective-C ,ios,iphone开发基础:JSON解析(使用苹果官方提供的JSON库:NSJSONSerialization)

    json和xml的普及个人觉得是为了简化阅读难度,以及减轻网络负荷,json和xml 数据格式在格式化以后都是一种树状结构,可以树藤摸瓜的得到你想要的任何果子. 而不格式化的时候json和xml 又是 ...

  5. Hibernate的几种主键生成策略

    主键类型: 业务主键(natural key):业务主键的值是来源于一个业务数据. 代理主键(surrogate key):代理主键需要采用一种方式来生成某个唯一值. 代理主键的生成策略: 1.hib ...

  6. CF Fox And Names (拓扑排序)

    Fox And Names time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

  7. [改善Java代码]强制声明泛型的实际类型

    Arrays工具类有一个方法asList可以把一个变长参数或数组变成列表,但是它有一个缺点:它所生成的List长度是不可改变的,而这在我们的项目开发中很不方便. import java.util.Ar ...

  8. hdu 4284 深度优先搜索

    思路:就是找能走的走,遍历一边所有情况,满足就退出. Accepted 4284 328MS 2280K 2239 B C++ //#pragma comment(linker, "/STA ...

  9. java性能

    一.关于性能的基本知识  1.性能的定义  在我们讨论怎样提高Java的性能之前,我们需要明白“性能“的真正含义.我们一般定义如下五个方面作为评判性能的标准.  1) 运算的性能----哪一个算法的执 ...

  10. Tomcat - 设置 HTTP 摘要认证

    在 Tomcat 中设置 HTTP 摘要认证的示例 在 Tomcat 中设置摘要认证与设置基本认证几乎一样,差别在于配置 web.xml 时,<login-config/> 元素在指定认证 ...