对于观察者模式,PHP通过标准PHP库(SPL)提供了内建的支持,下面用SPL对昨天的观察者模式示例进行修改。
代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><?php
classWeatherDataimplementsSplSubject
{
private$observers=null;
private$temperature=0;
private$humidity=0;
private$pressure=0;
public__construct()
{
$this->observers=newSplObjectStorage();
}
publicfunctiongetTemperature()
{
return$this->temperature;
}
publicfunctionsetTemperature($temp)
{
$this->temperature=$temp;
}
publicfunctiongetHumidity()
{
return$this->humidity;
}
publicfunctionsetHumidity($humidity)
{
$this->humidity=$humidity;
}
publicfunctiongetPressure()
{
return$this->pressure;
}
publicfunctionsetPressure($pressure)
{
$this->pressure=$pressure;
}
publicfunctionsetMeasurements($temperature,$humidity,$pressure)
{
$this->setTemperature($temperature);
$this->setHumidity($humidity);
$this->setPressure($pressure);
$this->measureChanged();
}
publicfunctionmeasureChanged()
{
$this->notify();
}
publicfunctionattach(SplObserver$observer)
{
$this->observers->attach($observer);
}
publicfunctiondetach(SplObserver$observer)
{
$this->observers->detach($observer);
}
publicfunctionnotify()
{
foreach($this->observersas$observer){
$observer->update($this);
}
}
publicfunctiongetObservers()
{
return$this->observers;
}
}
abstractclassBaseDisplayimplementsSplObserver
{
private$weatherData=null;
publicfunction__construct(WeatherData$weatherData=null)
{
$this->weatherData=$weatherData;
if($weatherData!=null){
$this->weatherData->attach($this);
}
}
publicfunctionupdate(SplSubject$subject)
{
if($subject===$this->weatherData){
$this->realUpdate($subject);
}
}
abstractfunctionrealUpdate(WeatherData$weatherData);
}
classCurrentConditionDisplayextendsBaseDisplay
{
private$temperature=0;
private$humidity=0;
private$pressure=0;
functionrealUpdate(WeatherData$weatherData)
{
$this->temperature=$weatherData->getTemperature();
$this->humidity=$weatherData->getHumidity();
$this->pressure=$weatherData->getPressure();
print("temp:".$this->temperature.",humi:".$this->humidity.",pressure:".$this->pressure."/n");
}
}
classGeneralDisplayextendsBaseDisplay
{
functionrealUpdate(WeatherData$weatherData)
{
print("GeneralDisplay/n");
}
}
$weatherData=newWeatherData();
$display=newCurrentConditionDisplay($weatherData);
$display2=newGeneralDisplay($weatherData);
$weatherData->setMeasurements(20,30,40);
$weatherData->detach($display2);
print("after.../n");
$weatherData->setMeasurements(33,44,55);
?>
分享到:
相关推荐
HeadFirst设计模式学习笔记比较全面详细地讲解了13个设计模式,有利于大家更好的学习HeadFirst设计模式,希望亲们会喜欢~~~
笔记_HeadFirst设计模式
Head First 设计模式学习笔记。更多内容请参见文章内容。
HeadFirst设计模式 读书 笔记
1.1 《Head First设计模式》阅读笔记.第一章 1.2 《Head First设计模式》阅读笔记.第二章 1.3 《Head First设计模式》阅读笔记.第三章 1.4 《Head First设计模式》阅读笔记.第四章 1.5 《Head First设计模式》...
HeadFirst 设计模式学习笔记3--装饰模式 Demo http://blog.csdn.net/laszloyu/archive/2010/05/12/5582561.aspx
Head First设计模式读书笔记-DesignPatterns
HeadFirst 设计模式学习笔记2--观察者模式 demo http://blog.csdn.net/laszloyu/archive/2010/05/12/5581769.aspx
http://blog.csdn.net/laszloyu/archive/2010/05/11/5579765.aspx 示例代码
Head.First 设计模式学习笔记.pdf Head.First 设计模式学习笔记.pdf
NULL 博文链接:https://zhangfy068.iteye.com/blog/1706132
著名的《Head First Design ...由于书本过长,整理出笔记帮助回想起设计模式。文件是docx格式,只能由OFFICE Word 2007之后的版本打开,内附Visio类图文件。本文由个人整理摘录,部分内容来自书本,仅供学习使用。
NULL 博文链接:https://never-say-never.iteye.com/blog/851923
NULL 博文链接:https://chxiaowu.iteye.com/blog/1276845
headfirst 设计模式读书笔记 书很好,浅显易懂,例子生动,适合初学者
趣味的移动开发讲解讲解,类似个人笔记,非常容易懂的,有好多勾画图
设计模式Head First学习笔记,以及使用java编写的设计模式源码,Java原生sdk实现23种设计模式
java原始中的设计模式 Gof设计模式 一个Android应用程序,该应用程序演示了以下来源的GoF设计模式的源代码: E.Freeman,E.Freeman,K.Sierra,B.Bates的书:copyright:O'Reilly 2004 布莱恩·汉森(Bryan Hansen),...