`
phinecos
  • 浏览: 343558 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

《Head First设计模式》读书笔记(二)

 
阅读更多

对于观察者模式,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);
?>

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics