Belajar Decorator Pattern dalam PHP - Design Pattern

Ahmad Oriza 10 Maret 2020

Belajar Decorator Pattern dalam PHP - Design Pattern

Decorator Pattern adalah pendekatan penyelesaian masalah yang diperkenalkan oleh Gang Of Four dalam buku Design Pattern legendaris mereka. Menggunakan pola ini, kamu dapat menambahkan fungsionalitas tambahan ke dalam objek yang ada tanpa melakukan extend sebuah objek. Mungkin kamu bertanya apa manfaat dari menambahkan fungsionalitas tambahan tanpa melakukan pewarisan.

Tentu ada beberapa manfaatnya. Untuk Extend sebuah objek, seringkali kamu harus mengetahui banyak hal-hal di dalam kelas tersebut. Seringkali tidak mungkin untuk extend tanpa menulis ulang fungsionalitas yang ada. Jika kamu ingin menambahkan fungsionalitas yang sama kedalam beberapa tipe dari objek, akan lebih baik ketika menambahkan mereka menggunakan Decorator Pattern daripada meng-extend semuanya secara satu-persatu. Jika tidak, mungkin ini bisa membawa anda ke pemeliharaan aplikasi yang sangat menyeramkan.

Image

Mari kita ke skenario yang umum, sebagai contoh, bayangkan ketika kamu membangun sebuah blog dan disitu ada fitur komentar. Data komentar ini memiliki objek tersendiri. Object komentar tersebut memiliki method yaitu getContent() dimana akan mengembalikan konten komentar.

Lalu ceritanya beberapa bulan kemudian setelah launching produk kamu membutuhkan fungsionalitas tambahan untuk memasukan Emoticon. Ceritanya inti badan program begitu komplek dan kamu tidak mau mengotak-atiknya. disini Decorator Pattern dapat menyelamatkan kamu.

Mari kita lihat kode berikut ini :

<?php // Sebuah class komentar. Yang memiliki properti / field name dan content. class Comment { private $name; private $content = 'Senyum manis :)'; // Mempunyai getter message, baca lagi tentang getter pada materi setter/getter. public function getContent() { // Mengembalikan data pesan apa adanya. return $this->content; } } $comment = new Comment; echo $comment->getContent(); ?>

Kode diatas akan mengeluarkan output :

Senyum manis :)

Terlihat tidak ada masalah pada class diatas. Tapi, sesuai scenario, ceritanya akan kita tambahkan fungsionalitas parser Emoticon. Mari kita buat class decorator nya tanpa melibatkan class Comment sama sekali.

<?php class EmoticonParser { private $content; // Membuat constuctor yang menerima object. Ini yang membuat independen. Nnt object yang membutuhkan Emoticon dipassing lewat sini. public function __construct($object) { $this->content = $object; } public function getContent() { // Nah disini class methodnya kita semacam override, dengan method yang sama kita tambahkan fungsionalitas Emoticon. // Panggil parseEmoticon. return $this->parseEmoticon($this->content->getContent()); } private function parseEmoticon($content) { // Ini hanya contoh ya, harusnya parser Emoticon lebih rumit dari ini. Kita hanya string replace senyuman jadi gambar aja. return str_replace(':)', '<img width="40" src="https://findicons.com/files/icons/360/emoticons/128/smile_1.png" />', $content); } } ?>

Sudah jadi decorator / parser Emoticon nya. Bisa dilihat kita hanya membuat sebuah class yang dapat memanipulasi properti content. Disitu kita bikin method getContent yang isinya memparsing konten. Juga ditolong private method parseEmoticon yang secara teknis mengubah string jadi gambar.

Sekarang mari kita satukan semuanya. Kita terapkan decorator ke class Comment. Perhatikan kode lengkapnya :

<?php // Sebuah class komentar. Yang memiliki properti / field name dan message. class Comment { private $name; private $content = 'Senyum manis :)'; // Mempunyai getter message, baca lagi tentang getter pada materi setter/getter. public function getContent() { // Mengembalikan data pesan apa adanya. return $this->content; } } class EmoticonParser { private $content; // Membuat constuctor yang menerima object. public function __construct($object) { $this->content = $object; } // Nah disini class methodnya kita semacam override, dengan method yang sama kita tambahkan fungsionalitas Emoticon. public function getContent() { // Panggil parseEmoticon. return $this->parseEmoticon($this->content->getContent()); } private function parseEmoticon($content) { // Ini hanya contoh ya, harusnya parser Emoticon lebih rumit dari ini. Kita hanya string replace senyuman jadi gambar aja. return str_replace(":)", "<img width='40' src='https://findicons.com/files/icons/360/emoticons/128/smile_1.png' />", $content); } } // Instansiasi Comment. $comment = new Comment; echo 'Sebelum parsing : ' . $comment->getContent(); echo '<hr/>'; // Kita ingin parsing, tinggal bikin instansiasi EmoticonParse lalu masukan object Comment jadi parameter. $EmoticonParser = new EmoticonParser($comment); echo 'Setelah parsing : ' . $EmoticonParser->getContent(); // Method yang dipanggil sama :) getContent ?>

Pada kode diatas kita menginstansiasi class Comment dan mencoba mengeluarkan output content. Kemudian kita bikin lagi object EmoticonParser yang mempassing objek Comment. Setelah itu kita panggil fungsionalitas decorator nya yaitu getContent. Outputnya akan terlihat seperti ini :

Image

Begitulah cara menambahkan fungsionalitas tambahan kedalam objek yang sudah ada tanpa menyentuh program utama. Kamu melihat dimana EmoticonParser dapat menerima objek apapun. Silahkan coba kode diatas pada komputer kamu, jika berhasil maka selamat! Kamu sudah berhasil menerapkan Decorator Pattern