Qeyd: Dilimizin texniki leksikonu olduqca məhduddur, ona görə bəzi sizə tanış olmayan terminlər görə bilərsiniz, tövsiyyələrini mənə yaza bilərsiniz

Adından bəlli olduğu kimi bu pattern izləmə ilə bağlıdır.

Nədir bu pattern

Observer patterni individual üzvolan (Subscriber) obyektlərin yayımlayan (Publisher) obyetin vəziyyət dəşikliyi ilə bağlı olan hadisə axınına üzvolma mexanizmini irəli sürür. Bu patterndə subyekt olan obyekt, və bunu izləyən obyektlər - izləyəcilər olur. Subyekt özünə izləyicilərini əlavə edir, və özünün hal dəyişikliyi vaxtı izləyicilərini avtomatik olaraq xəbərdar edir. Buna başqa deyimlə Publish-Subscribe də demək olar, Subyekt Publisher, onun izləyiciləri isə Subscriberlər olur.

Bəs hansı hallarda istifadə oluna bilər?

Təsəvvür edin E-kommersiya məhsulu üzərində işləyirsiniz, istifadəçiniz hər uğurlu alış-verişi zamanı verilənlər bazasına bu barədə qeyd yazmaq, e-mail göndərmək, bildiriş əlavə etmək və s. etmək istəyirsiniz.

Real həyatdan nümunə

Bunu bir çoxumuzu aylıq maqazinlərə və ya qəzetlərə üzv olaraq edirik. Bu halda subyekt qəzet, bizlər isə izləyici rolunda çıxış edirik, qəzet bizi hər ay xəbərdar edir.

Necə tətbiq olunur

Subyekt olan obyekt özünə üzv, üzvlüyü ləğv edə, və xəbərdar edə bilmək metodları, İzləyənlər isə subyektin onu xəbərdar etməsi üçün metoduna sahib olmalıdır. Bir qayda olaraq bu patterndə iştirak edən obyektlər bu patternin interfeysini tətbiq etməlidir. PHP-də bu məqsədlə SPLObserverSPLSubject, əlbəttə bunu özünüz də yaza bilərsiniz, amma var olan həlli istifadə etmək daha məqsədəuyğundur.

Nümunə olaraq


<?php

class Magazine implements  \SplSubject
{
    private $observers;
    private $name;

    public function __construct($name)
    {
        $this->name = $name;
        $this->observers = new \SplObjectStorage();
    }

    /**
     * {@inheritdoc}
     */
    public function attach(SplObserver $observer)
    {
        $this->observers->attach($observer);
    }

    /**
     * {@inheritdoc}
     */
    public function detach(SplObserver $observer)
    {
        $this->observers->detach($observer);
    }

    /**
     * {@inheritdoc}
     */
    public function notify()
    {
        /** @var SplObserver $observer */
        foreach ($this->observers as $observer) {
            $observer->update($this);
        }
    }

    public function getName()
    {
        return $this->name;
    }
}

class Subscriber1 implements SplObserver
{
    /**
     * {@inheritdoc}
     */
    public function update(SplSubject $subject)
    {
        echo sprintf("%s \"%s\" jurnalının bu aykı sayını aldı!\n", __CLASS__, $subject->getName());
    }
}

class Subscriber2 implements SplObserver
{
    /**
     * {@inheritdoc}
     */
    public function update(SplSubject $subject)
    {
        echo sprintf("%s \"%s\" jurnalının bu aykı sayını aldı!\n", __CLASS__, $subject->getName());
    }
}

$subscriber1 = new Subscriber1();
$subscriber2 = new Subscriber2();

$magazine = new Magazine('Mad Magazine');

$magazine->attach($subscriber1);
$magazine->attach($subscriber2);
$magazine->notify();

/*

Ekranda görünəcək

Subscriber1 "Mad Magazine" jurnalının bu aykı sayını aldı!
Subscriber2 "Mad Magazine" jurnalının bu aykı sayını aldı!

*/