Csatlakozz a Slack chatre
Hocza József / 1 éve

Interface - Polymorphism

Egy hasznos dolog, amit Laraveltől függetlenül is felhasználhatsz akár más programozási nyelvekben is.

Ha már az előző posztomban úgyis azt mondtam, hogy a Notificationös dolgot le lehetne tudni Interfacel, hát íme. :)

Tegyük fel, hogy szeretnél értesítést küldeni a felhasználóknak, ám nem mindenkinek tudod (vagy kell) minden elérhető csatornán kiküldeni.

Először jöjjön a mintakód, aztán a szöveg. :)

interface NotificationChannelInterface
{
    private $message;

    public function message($string);

    public function send();
}

class EmailNotificationChannel implements NotificationChannelInterface
{
    private $message;

    public function message($string)
    {
        $this->message = $string;
    }

    public function send()
    {
        echo "Emailben kiküldve: ".$this->message;
    }
}

class SMSNotificationChannel implements NotificationChannelInterface
{

    private $message;

    public function message($string)
    {
        $this->message = $string;
    }

    public function send()
    {
        echo "SMSben kiküldve: ".$this->message;
    }
}

class OrderProcessor
{
    private $notificationChannels[];

    private $order;

    public function __construct(Order $order)
    {
        $this->order = $order;
    }

    public function addChannel(NotificationChannelInterface $channel)
    {
        array_push($this->notificationChannels, $channel);
    }

    public function process()
    {
        //feldolgozo kod helye...
        
        //ertesitesek kuldese
        foreach($this->notificationChannels as $channel)
        {
            $channel
                ->message("Megrendelését feldolgoztuk. 1 munkanapon belül várható az érkezése.\n")
                ->send();
        }
    }
}


// Hasznalatban

$order = Order::find(1);
$orderProcessor = new OrderProcessor($order);
$orderProcessor->addChannel( new EmailNotificationChannel() );
$orderProcessor->addChannel( new SMSNotificationChannel() );
$orderProcessor->process();

// output:

Emailben kiküldve: Megrendelését feldolgoztuk. 1 munkanapon belül várható az érkezése.
SMSben kiküldve: Megrendelését feldolgoztuk. 1 munkanapon belül várható az érkezése.

(gyorsan leszögezem, igen, ez csak echozik..., nincs ténylegesen megvalósítva)

Mint láthatod, először létrehoztunk egy Interfacet. Majd 2 különböző féle Classt ami megvalósítja azt az Interfacet.
Az OrderProcessor Class fiktíven most azért felelős, hogy feldolgozzon egy megrendelést. Ám szeretnénk, ha a megrendelés feldolgozása után értesítést lehessen küldeni a felhasználónak. Ahelyett, hogy be hardcodeolnám a 2 db Notification Classt, azt választottam, hogy olyan Channeleket lehet megadni, melyek implementálják a NotificationChannelInterface-t. Mivel interfacet használnuk nem fog hibára futni, mert a tömbbe elhelyezett Classok rendelkeznek egy message($string)-el és send() metódussal.

Ha pedig a jövőben bármi más, akár APNs (Apple Push Notification Service) behozatalát tervezzük, akkor a meglévő osztályokat már nem kell piszkálni. :)

Címke:    php,interface,polymorphism,intermediate
 Vissza a cikkekhez