Az observer minta 1. rész

Az observer vagy magyarul megfigyelő minta lényege:

Ha van egy objektumunk, amelynek bármilyen állapotváltozását figyelni szeretnénk. Ez az objektum a subject vagy observable néven ismert és eseményeket vált ki, amit figyelni szeretnénk. Az objektumok egymás szerkezetéről nem tudnak semmit. A minta az objektumok közötti 1:N kapcsolat megvalósításában segít.

A minta megértéséhez a következő a mintában szereplő kifejezéseket kell megismernünk: Subject, Observer, tényleges Subject, tényleges Observer.

Az UML jelölést felhasználva:

A következő elméleti példában a Competition osztály(subject) megvalósítja az Observable interfészt, vagyis regisztrálja(attach) és tárolja(observers tömb) vagy törli(detach) a figyelő(Observer) osztályokat(Runners). Amennyiben állapotváltozás történt a subject osztály(Competition) értesíti(notify) a figyelő osztályokat(Runners) a változásról és meghívja a regisztrált osztályok update függvényét.


interface Observable{
   function attach(Observer $observer);
   function detach(Observer $observer);
   function notify();
}

interface Observer{
   function update(Observable $observer);
}

class Competitions implements Observable{

   private $observers;
   private $status;
   private $location;

   public function Competitions($location){
      $this->observers = array();
      $this->status = array();
      $this->location = $location;
   }

   public function attach(Observer $observer){
      $this->observers[] = $observer;
   }

   public function detach(Observer $observer){
      $this->observers = array_diff( $this->observers, array( $observer ));
   }

   public function notify(){
      foreach ( $this->observers as $obs ){
         $obs->update($this);
      }
   }

   public function getStatus( ){
      return $this->status[count($this->status)-1];
   }

   public function getLocation(){
      return $this->location;
   }

   public function setStatus( $status ){
      $this->status = array( $status );
   }

   public function changeLocation($location){
      $this->location = $location;
      $this->setStatus("LOCATION_CHANGED");
      $this->notify();
   }

   public function addRunners($name){
      new Runners($this, $name);
   }
}

class Runners implements Observer{

   private $subject;
   private $name;

   public function Runners($subject, $name){
      $this->name = $name;
      $this->subject = $subject;
      $subject->attach($this);
   }

   public function update(Observable $observer){
      $status = $observer->getStatus( );
      $location = $observer->getLocation();
      echo $this->name . " " . $status . " " . $location . "\n";
   }

}

$competition = new Competitions("Budapest Halfmarathon");
$competition->addRunners("Haile Gebrasilles");
$competition->addRunners("Dibaba");
$competition->addRunners("Steve Prefontaine");
$competition->changeLocation("Wien Halfmarathon");

A továbbiakban a 2. részben egy “életszagúbb” példát valósítok meg a minta felhasználásával.

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter


A bejegyzés kategóriája:Tervezési minták and tagged . Vedd fel a kedvencek közé: link. Szólj hozzá vagy hagyj egy trackback-et:Trackback URL.

Szólj hozzá

Hozzászólás küldéséhez Be kell jelentkezni