Decorator Design Pattern – Dekoratör Tasarım Deseni

Standard

Merhaba herkese,

Öncelikli olarak Design Pattern yani tasarım desenleri nedir? PHP ile ele alalım başlıklı makalemi okumanızı ve design pattern ler hakkında kabaca bilgi edinmenizi öneririm.

Bugün size Yapısal Tasarım Desenlerinden (Tasarım deseni demek saçma geliyor ben orjinalini kullanma kararı aldım an itibari ile 🙂 ) Decorator Design Pattern ‘i anlatacağım..

Decorator tasarım deseni, bir nesneye dinamik olarak yeni özellikler eklemek için kullanılır. Kalıtım kullanmadan da bir nesnenin görevlerini artırabileceğimizi gösterir.

Bir örnek ile konuyu anlaşılır hale getireceğiz:

<?php

//Kitap Sınıfımız
class Book
{
    private $author;
    private $title;

    function __construct($title_in, $author_in)
    {
        $this->author = $author_in;
        $this->title = $title_in;
    }

    function getAuthor()
    {
        return $this->author;
    }

    function getTitle()
    {
        return $this->title;
    }

    function getAuthorAndTitle()
    {
        return $this->getTitle() . ' by ' . $this->getAuthor();
    }
}

class BookTitleDecorator
{
    protected $book;
    protected $title;

    public function __construct(Book $book_in)
    {
        $this->book = $book_in;
        $this->resetTitle();
    }

    //original nesnenin title ı ile overwrite ediyoruz
    function resetTitle()
    {
        $this->title = $this->book->getTitle();
    }

    function showTitle()
    {
        return $this->title;
    }
}

class BookTitleExclaimDecorator extends BookTitleDecorator
{
    private $btd;

    public function __construct(BookTitleDecorator $btd_in)
    {
        $this->btd = $btd_in;
    }

    function exclaimTitle()
    {
        $this->btd->title = "!" . $this->btd->title . "!";
    }
}

class BookTitleStarDecorator extends BookTitleDecorator
{
    private $btd;

    public function __construct(BookTitleDecorator $btd_in)
    {
        $this->btd = $btd_in;
    }

    function starTitle()
    {
        $this->btd->title = Str_replace(" ", "*", $this->btd->title);
    }
}

echo '-- DECORATOR PATTERN TESTi --<br><br>';

$patternBook = new Book('PHP, C++, ASP.NET, DELPHI', 'Design Patterns');

$decorator = new BookTitleDecorator($patternBook);
$starDecorator = new BookTitleStarDecorator($decorator);
$exclaimDecorator = new BookTitleExclaimDecorator($decorator);

echo 'Başlıklar : <br>';
echo $decorator->showTitle().'<br><br>';

echo 'Başlıkların başına sonuna ! ekleyerek gösterelim : <br>';
$exclaimDecorator->exclaimTitle();
$exclaimDecorator->exclaimTitle();//ikinci kez ekledik
echo $decorator->showTitle().'<br><br>';

echo 'Başlıkların başındaki space i * ile değiştirerek gösterelim : <br>';
$starDecorator->starTitle();
echo $decorator->showTitle().'<br><br>';

echo 'Başlıkları resetleyip gösterelim : <br>';
$decorator->resetTitle();
echo $decorator->showTitle().'<br><br>';

echo '-- DECORATOR PATTERN TESTi --';
?>

Anlaşılır olmuştur umarım, anlaşılmayan bişi olursa yanıtlarım.. Kolay gelsin.

Print Friendly, PDF & Email
Facebooktwittergoogle_pluslinkedin

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir