Soru, görüş ve önerileriniz için;

contact@fatih-karakus.com

Observer Design Pattern

Observer Design Pattern

Yazılım geliştirmede, nesneler arasındaki bağımlılıkları azaltmak ve olay tabanlı uygulamalar oluşturmak önemlidir. Observer Design Pattern (Gözlemci Tasarım Deseni), bu amaçla kullanılan ve nesneler arasındaki iletişimi kolaylaştıran bir tasarım desenidir. Bu yazıda, Observer Design Pattern'i örneklerle adım adım açıklayacağım ve nasıl kullanıldığını göstermeye çalışacağım.

Observer Design Pattern Nedir?

Observer Design Pattern, bir nesnenin durumunda meydana gelen değişiklikleri izlemek ve bu değişikliklere tepki vermek için kullanılır. Bu desen, yayıncı (subject) ve abone (observer) yapısıyla çalışır. Yayıncı, durumu değiştirdiğinde abonelere (observer'lar) otomatik olarak bildirim gönderir ve aboneler bu bildirimi alarak gereken aksiyonu alır.

Observer Design Pattern Yapısı

Observer Design Pattern, genellikle aşağıdaki bileşenleri içerir:

  • Subject (Yayıncı): Durumu takip eden ve abonelere bildirim gönderen ana sınıftır.
  • Observer (Abone): Yayıncıyı izleyen ve durum değişikliklerine tepki veren arayüzdür.
  • Concrete Subject (Somut Yayıncı): Yayıncı sınıfının somut uygulamasıdır.
  • Concrete Observer (Somut Abone): Observer arayüzünü uygulayan ve bildirimleri alan somut uygulama sınıflarıdır.

Şimdi bir örnek üzerinden Observer Design Pattern'in nasıl uygulandığını görelim. Örneğimizde bir hava durumu uygulaması oluşturacağız. Hava durumu güncellendiğinde abonelere otomatik olarak bildirim gönderilecek.

// Abone (Observer) arayüzü
interface Observer {
    public function update($temperature, $humidity, $pressure);
}

// Yayıncı (Subject) sınıfı
class WeatherStation {
    private $observers = [];
    private $temperature;
    private $humidity;
    private $pressure;
    
    public function registerObserver(Observer $observer) {
        $this->observers[] = $observer;
    }
    
    public function removeObserver(Observer $observer) {
        $index = array_search($observer, $this->observers);
        if ($index !== false) {
            unset($this->observers[$index]);
        }
    }
    
    public function notifyObservers() {
        foreach ($this->observers as $observer) {
            $observer->update($this->temperature, $this->humidity, $this->pressure);
        }
    }
    
    public function setMeasurements($temperature, $humidity, $pressure) {
        $this->temperature = $temperature;
        $this->humidity = $humidity;
        $this->pressure = $pressure;
        $this->notifyObservers();
    }
}

// Somut Abone (Concrete Observer) sınıfları
class PhoneDisplay implements Observer {
    public function update($temperature, $humidity, $pressure) {
        echo "Telefon Ekranı: Sıcaklık: $temperature °C, Nem: $humidity%, Basınç: $pressure hPa\n";
    }
}

class TabletDisplay implements Observer {
    public function update($temperature, $humidity, $pressure) {
        echo "Tablet Ekranı: Sıcaklık: $temperature °C, Nem: $humidity%, Basınç: $pressure hPa\n";
    }
}

Şimdi Observer Design Pattern'i kullanarak hava durumu uygulamasını oluşturalım.

// Kullanım örneği
$weatherStation = new WeatherStation();

$phoneDisplay = new PhoneDisplay();
$tabletDisplay = new TabletDisplay();

$weatherStation->registerObserver($phoneDisplay);
$weatherStation->registerObserver($tabletDisplay);

$weatherStation->setMeasurements(25, 70, 1013);
// Telefon Ekranı: Sıcaklık: 25 °C, Nem: 70%, Basınç: 1013 hPa
// Tablet Ekranı: Sıcaklık: 25 °C, Nem: 70%, Basınç: 1013 hPa

$weatherStation->removeObserver($phoneDisplay);

$weatherStation->setMeasurements(27, 65, 1010);
// Tablet Ekranı: Sıcaklık: 27 °C, Nem: 65%, Basınç: 1010 hPa

Sonuç olarak, Observer Design Pattern, yayıncı ve abone yapısıyla çalışır ve nesneler arasındaki bağımlılığı azaltır. Örneklendirme yoluyla Observer Design Pattern'in nasıl uygulanacağını ve bir hava durumu uygulaması üzerinden nasıl kullanılabileceğini gösterdim. Observer Design Pattern, kodun daha esnek, ölçeklenebilir ve sürdürülebilir olmasını sağlar ve olay tabanlı uygulamaların geliştirilmesinde etkili bir rol oynar.