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

对于观察者模式,PHP通过标准PHP(SPL)提供了内建的支持,下面用SPL对昨天的观察者模式示例进行修改。

ExpandedBlockStart.gif 代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> <? php
class WeatherData implements SplSubject
{
private $observers = null ;
private $temperature = 0 ;
private $humidity = 0 ;
private $pressure = 0 ;
public __construct()
{
$this -> observers = new SplObjectStorage();
}
public function getTemperature()
{
return $this -> temperature;
}
public function setTemperature( $temp )
{
$this -> temperature = $temp ;
}
public function getHumidity()
{
return $this -> humidity;
}
public function setHumidity( $humidity )
{
$this -> humidity = $humidity ;
}
public function getPressure()
{
return $this -> pressure;
}
public function setPressure( $pressure )
{
$this -> pressure = $pressure ;
}
public function setMeasurements( $temperature , $humidity , $pressure )
{
$this -> setTemperature( $temperature );
$this -> setHumidity( $humidity );
$this -> setPressure( $pressure );
$this -> measureChanged();
}
public function measureChanged()
{
$this -> notify();
}
public function attach(SplObserver $observer )
{
$this -> observers -> attach( $observer );
}
public function detach(SplObserver $observer )
{
$this -> observers -> detach( $observer );
}
public function notify()
{
foreach ( $this -> observers as $observer ){
$observer -> update( $this );
}
}
public function getObservers()
{
return $this -> observers;
}
}
abstract class BaseDisplay implements SplObserver
{
private $weatherData = null ;
public function __construct(WeatherData $weatherData = null )
{
$this -> weatherData = $weatherData ;
if ( $weatherData != null ){
$this -> weatherData -> attach( $this );
}
}
public function update(SplSubject $subject )
{
if ( $subject === $this -> weatherData){
$this -> realUpdate( $subject );
}
}
abstract function realUpdate(WeatherData $weatherData );
}
class CurrentConditionDisplay extends BaseDisplay
{
private $temperature = 0 ;
private $humidity = 0 ;
private $pressure = 0 ;
function realUpdate(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 " );
}
}
class GeneralDisplay extends BaseDisplay
{
function realUpdate(WeatherData $weatherData )
{
print ( " GeneralDisplay/n " );
}
}
$weatherData = new WeatherData();
$display = new CurrentConditionDisplay( $weatherData );
$display2 = new GeneralDisplay( $weatherData );
$weatherData -> setMeasurements( 20 , 30 , 40 );
$weatherData -> detach( $display2 );
print ( " after.../n " );
$weatherData -> setMeasurements( 33 , 44 , 55 );
?>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值