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

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

  
  
  
  
  1. <?php  
  2.     class WeatherData implements SplSubject  
  3.     {  
  4.         private $observers = null;  
  5.         private $temperature = 0;  
  6.         private $humidity = 0;  
  7.         private $pressure = 0;  
  8.         public __construct()  
  9.         {  
  10.             $this->observers = new SplObjectStorage();  
  11.         }  
  12.         public function getTemperature()  
  13.         {  
  14.             return $this->temperature;  
  15.         }  
  16.         public function setTemperature($temp)  
  17.         {  
  18.             $this->temperature = $temp;  
  19.         }      
  20.         public function getHumidity()  
  21.         {  
  22.             return $this->humidity;  
  23.         }  
  24.         public function setHumidity($humidity)  
  25.         {  
  26.             $this->humidity = $humidity;  
  27.         }  
  28.         public function getPressure()      
  29.         {  
  30.             return $this->pressure;  
  31.         }  
  32.         public function setPressure($pressure)  
  33.         {      
  34.             $this->pressure = $pressure;  
  35.         }  
  36.         public function setMeasurements($temperature$humidity$pressure)   
  37.         {  
  38.             $this->setTemperature($temperature);  
  39.             $this->setHumidity($humidity);  
  40.             $this->setPressure($pressure);  
  41.             $this->measureChanged();              
  42.         }  
  43.         public function measureChanged()  
  44.         {  
  45.             $this->notify();  
  46.         }  
  47.         public function attach(SplObserver $observer)  
  48.         {  
  49.             $this->observers->attach($observer);  
  50.         }  
  51.         public function detach(SplObserver $observer)  
  52.         {  
  53.             $this->observers->detach($observer);  
  54.         }  
  55.         public function notify()  
  56.         {  
  57.             foreach ($this->observers as $observer) {  
  58.                 $observer->update($this);  
  59.             }  
  60.         }  
  61.         public function getObservers()   
  62.         {  
  63.             return $this->observers;  
  64.         }  
  65.     }  
  66.     abstract class BaseDisplay implements SplObserver  
  67.     {  
  68.         private $weatherData = null;   
  69.         public function __construct(WeatherData $weatherData = null)  
  70.         {  
  71.             $this->weatherData = $weatherData;  
  72.             if ($weatherData != null) {  
  73.                 $this->weatherData->attach($this);  
  74.             }  
  75.         }  
  76.         public function update(SplSubject $subject)  
  77.         {  
  78.             if ($subject === $this->weatherData) {  
  79.                 $this->realUpdate($subject);  
  80.             }  
  81.         }  
  82.         abstract function realUpdate(WeatherData $weatherData);  
  83.     }  
  84.     class CurrentConditionDisplay extends BaseDisplay  
  85.     {  
  86.         private $temperature = 0;  
  87.         private $humidity = 0;  
  88.         private $pressure = 0;  
  89.         function realUpdate(WeatherData $weatherData)      
  90.         {  
  91.             $this->temperature = $weatherData->getTemperature();  
  92.             $this->humidity = $weatherData->getHumidity();  
  93.             $this->pressure = $weatherData->getPressure();  
  94.             print("temp: " . $this->temperature . ", humi: " . $this->humidity . ", pressure: " . $this->pressure . "\n");  
  95.         }  
  96.     }  
  97.     class GeneralDisplay extends BaseDisplay  
  98.     {  
  99.         function realUpdate(WeatherData $weatherData)      
  100.         {  
  101.             print("GeneralDisplay\n");  
  102.         }  
  103.     }  
  104.     $weatherData = new WeatherData();  
  105.     $display = new CurrentConditionDisplay($weatherData);  
  106.     $display2 = new GeneralDisplay($weatherData);  
  107.     $weatherData->setMeasurements(20,30,40);  
  108.     $weatherData->detach($display2);  
  109.     print("after...\n");  
  110.     $weatherData->setMeasurements(33,44,55);  
  111. ?>  

 

你可能感兴趣的:(PHP,职场,休闲)