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

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

代码
<? 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 );
?>

 

 

你可能感兴趣的:(《Head First设计模式》读书笔记(二))