Tutorial Design Pattern : Penerapan Design Pattern Decorator di PHP

Malam ini begadang lagi, demi mengemban sebuah tugas kampus yang sampai sekarang belum selesai juga. Padahal sudah saya cicil tiap ada waktu kosong :p, tidak lain dan tidak bukan tugas design pattern. Teman-teman saya jam segini mungkin sudah tidur dan saya masih begadang. Semua itu akan terbalik ketika mendekati UAS, saya jam segini sudah tidur dan mereka masih berkutat sama tugas UAS :ngakaks:. Tak apalah, sebenarnya sama saja cuma waktunya saja yang berbeda. Nah, pada postingan malam ini saya akan kembali membahas design pattern, gilirannya si Decorator yang minta dibahas. Decorator mempunyai arti yang kalau di-bahasa-indonesia-kan yaitu tukang modif alias perias. Design pattern Decorator bertugas untuk memodifikasi value-value yang dimiliki oleh kelas utama, tanpa mengubah bentuk dan identitas dari si kelas utama. Dalam proses pengubahan/modifikasinya, value-value dalam kelas utama digandakan terlebih dahulu ke dalam variabel lain. 

Contohnya yang paling gampang dan paling sering kita temui ialah pada sebuah sepeda motor. Dimana saya ambil 2 komponen utamanya yaitu rangka dan ban. Seperti yang kita lihat akhir-akhir ini, banyak anak muda yang memodifikasi motornya. Ada yang mengubah bentuk rangka, mengganti variasi ban, dan banyak yang lainnya. Walaupun sudah mengalami proses modifikasi, tapi objek tetap berwujud dan beridentitas motor hanya saja mendapatkan tambahan variasi-variasi di berbagi komponennya. Dan ketika hendak mengubahnya ke bentuk standar lagi, misalnya ingin mengubah rangka dan ban, kita hanya perlu mengambil rangka dan ban asli yang sudah kita simpan sebelum proses modifikasi. Kita coba untuk mengimplementasikannya ke dalam sebuah script php di bawah ini :

<?php

class Motor {
    private $rangka;
    private $ban;
    function __construct($rangka_in, $ban_in) {
        $this->rangka = $rangka_in;
        $this->ban  = $ban_in;
    }
    function ambilRangka() {
        return $this->rangka;
    }
    function ambilBan() {
        return $this->ban;
    }
}

class ModifikasiMotorDecorator {
    protected $motor;
    protected $rangka;
    protected $ban;
    public function __construct(Motor $motor_in) {
        $this->motor = $motor_in;
        $this->ubahRangkaStandar();
        $this->ubahBanStandar();
    }
    function ubahRangkaStandar() {
        $this->rangka = $this->motor->ambilRangka();
    }
    function ubahBanStandar() {
        $this->ban = $this->motor->ambilBan();
    }

    function tampilRangka() {
        return $this->rangka;
    }
    function tampilBan() {
        return $this->ban;
    }
}

class BubutRangka extends ModifikasiMotorDecorator {
    private $mt;
    public function __construct(ModifikasiMotorDecorator $mt_in) {
        $this->mt = $mt_in;
    }
    function modifRangka() {
        $this->mt->rangka = "<<<<--" . $this->mt->rangka . "-->>>>";
    }
}

class BubutBan extends ModifikasiMotorDecorator {
    private $mt;
    public function __construct(ModifikasiMotorDecorator $mt_in) {
        $this->mt = $mt_in;
    }
    function modifBan() {
        $this->mt->ban = "-||" . $this->mt->ban . "||-";
    }
}

  $motor = new Motor('Backbone Frame', 'Tubles');

  $modif = new ModifikasiMotorDecorator($motor);
  $modif_rangka = new BubutRangka($modif);
  $modif_ban = new BubutBan($modif);

  cetak('Rangka Standar : ');
  cetak($modif->tampilRangka());
  cetak('Ban Standar : ');
  cetak($modif->tampilBan());
  cetak('');

  cetak('Modif Rangka');
  $modif_rangka->modifRangka();
  cetak($modif->tampilRangka());
  cetak('');

  cetak('Modif Ban');
  $modif_ban->modifBan();
  cetak($modif->tampilBan());
  cetak('');

  cetak('Kembali Standar');
  $modif->ubahRangkaStandar();
  $modif->ubahBanStandar();
  cetak($modif->tampilRangka());
  cetak($modif->tampilBan());
  cetak('');

	function cetak($isi)
	{
		echo $isi."<br/>";
	}

?>

Ada fungsi extends dari ModifikasiMotorDecorator ketika kita ingin melakukan proses BubutRangka maupun BubutBan. Karena pada class ModifikasiMotorDecorator menyimpan sebuah variabel yang bersifat protected, yang kita anggap saja sebagai bentuk standar/atau asli dari spare part motor. Ketika kita ingin mengubahnya kembali ke bentuk standar akan menjadi lebih mudah. Hahhh, gampang kan penerapan dan contohnya…?? Mudah-mudahan jelas, kalau gak jelas silahkan dipelajari kembali ;). OK deh, sekian dulu postingan saya malam ini, mau tidur dulu karena besok harus bangun pagi untuk menjadi asisten praktikum di kampus. Semoga sedikit postingan sederhana ini bisa bermanfaat untuk kita semua. Astungkara.

Happy Blogging and Keep Coding

Cheerrrss….!!!!

3 comments

  1. ey_coss Reply

    keren… salut dengan perjuanganmu….. Lanjutkan Mas Brow…

  2. ketut Reply

    seng ade ane nganggo php program perpustakaan ne bliee?

  3. fahmi Reply

    saya ingin tanya mas..
    mas bagaimana klo semisal class motor di tambah fungsi buat setingRangka() (fungsi untuk mensetting rangka misalnya)? kan jadi lebih sederhana programnya.