Tutorial Design Pattern : Penerapan Design Pattern Bridge di PHP

Hari ini saya disuguhi dengan rutinitas yang cukup padat, padahal saya tidak ke kampus alias bolos :p. Ada saja pekerjaan yang menghampiri, jadilah saya nangkring di depan laptop lagi. Duduk berlama-lama ternyata bisa mengakibatkan perut tambah buncit (#haha) dan saya telah menjadi korbannya. Padahal saya sudah jarang ngemil, paling juga cuma ngemil air putih + rokok, tapi tetap saja perut saya tambah buncit. Pantas cewek-cewek jadi menjauh dari saya :ngakaks:, dekat-dekat saya cuma pas ada maunya doang. Mumpung jam sedang menunjukkan waktu jam makan siang dan kebetulan sedang nyantai, saya akan melanjutkan postingan tentang design pattern. Siang ini saya akan membahas design pattern Bridge, “si jembatan” yang berusaha memisahkan antara abstraksi dengan implementasinya. Dari sekian design pattern, yang ini cukup susah untuk dipahami. Terbukti dengan lamanya waktu saya mempelajari design pattern yang ternyata sangat bermanfaat untuk menghemat turunan class.

Design pattern Bridge ini bersifat decouple yang artinya terpisah alias tidak berpasangan (bisa juga dibilang jomblo :D). Disini kita akan banyak menggunakan abstract class dan implementasi/turunan class. Saya contohkan studi kasusnya pada sebuah instalasi listrik di sebuah rumah, ada sebuah abstract class Saklar yang bisa dikondisikan ke dalam kondisi hidup maupun mati. Kemudian ada tiga ruangan yang membutuhkan sakalr tersebut yaitu kamar tidur, dapur dan garasi. Gambarnya seprti di bawah ini :

Permasalahan yang muncul dari gambar di atas ialah jika dibutuhkan sebuah class abstract Testing yang diturunkan dari class Saklar, maka dibutuhkan juga class SaklarHidup dan SaklarMati untuk mendefinisikan abstract method status_awal dan status_akhir. Dapat dipastikan class nya akan terus bercabang dan berkembang biak :D. Maka dari itu, solusinya ialah memisahkan implementasi dengan abstract nya, seperti gambar di bawah ini :

Jika ada penambahan abstract method pada class Saklar dan mengharuskan penambahan abstract class yang mengimplementasikan class Saklar, maka SaklarImplmentasi tidak akan mengalami perubahan yang signifikan. Class diagramnya kira-kira seperti di bawah ini, kalau salah mohon koreksinya yaw 🙂 :

Setelah class diagram di atas, sekarang kita lanjutkan ke penerapannya pada sebuah script PHP seperti di bawah ini :

<?php

abstract class SaklarImplementasi {
    abstract function status_awal($in_awal);
    abstract function status_akhir($in_akhir);
}

class SaklarKamar extends SaklarImplementasi {
    function status_awal($status_awal_in) {
      return '|||||'.$status_awal_in.'|||||';
    }
    function status_akhir($status_akhir_in) {
      return '------'.$status_akhir_in.'------';
    }
}

class SaklarDapur extends SaklarImplementasi {
    function status_awal($status_awal_in) {
      return $status_awal_in;
    }
    function status_akhir($status_akhir_in) {
      return strtoupper($status_akhir_in);
    }
}

class SaklarGarasi extends SaklarImplementasi {
    function status_awal($status_awal_in) {
      return 'garasi - '.$status_awal_in;
    }
    function status_akhir($status_akhir_in) {
      return 'garasi - '.strtoupper($status_akhir_in);
    }
}

abstract class Saklar {
    private $status_awal;
    private $status_akhir;
    private $kode;
    function __construct($status_awal_in, $status_akhir_in, $kode_in) {
      $this->status_awal = $status_awal_in;
      $this->status_akhir  = $status_akhir_in;
      if ($kode_in == 'dapur') {
        $this->kode = new SaklarDapur();
      } else if($kode_in == 'kamar') {
        $this->kode = new SaklarKamar();
      } else if($kode_in == 'garasi') {
        $this->kode = new SaklarGarasi();
      }
    }
    function status_awal() {
      return $this->kode->status_awal($this->status_awal);
    }
    function status_akhir() {
      return $this->kode->status_akhir($this->status_akhir);
    }
}

class SaklarHidup extends Saklar {
    function hidupkan() {
      return $this->status_awal() . " -> " . $this->status_akhir();
    }
}

class SaklarMati extends Saklar {
    function matikan() {
      return $this->status_akhir() . ' -> ' . $this->status_awal();
    }
}
  cetak('Lampu Kamar, mati -> hidup');
  $saklar = new SaklarHidup('off','on','kamar');
  cetak($saklar->hidupkan());
  cetak('');

  cetak('Lampu Dapur, mati -> hidup');
  $saklar = new SaklarHidup('off','on','dapur');
  cetak($saklar->hidupkan());
  cetak('');

  cetak('Lampu Kamar, hidup -> mati');
  $saklar = new SaklarMati('off','on','kamar');
  cetak($saklar->matikan());
  cetak('');

  cetak('Lampu Dapur, hidup -> mati');
  $saklar = new SaklarMati('off','on','dapur');
  cetak($saklar->matikan());
  cetak('');

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

?>

Hehe, jika ada yang belum paham, artinya sama dengan saya dulu ketika membaca design pattern yang cukup maut ini. Solusinya ialah dengan membacanya berulang-ulang kali seperti saya :D. Dalam buku Gang of Four, design pattern Bridge ini masuk ke kelas medium untuk pemakaiannya, yang artinya masih lumayan sering dipakai. Dan memang harus dipelajari, karena manfaatnya sangat terasa. OK deh, sekian dulu postingan saya siang ini. Kalau yang belum paham, silahkan dipelajari kembali atau mencari referensi yang lebih lengkap via mbah google :). Semoga bisa bermanfaat untuk kita semua.

Happy Blogging and Keep Coding

Cheerrrss….!!!!

5 comments

  1. agus richi Reply

    kak luas banget wawasan webnya… btw kuliah di stikom bali or di mana
    ?? q scol di stimik stikom bali.. salam kenal za yo.. blz

  2. gusgus Reply

    tolong minta link ebookny(buku Gang of Four, design pattern) kl ada….

  3. adie Reply

    bli guna nya design patern itu untuk apa sih bli……….maklum bli masih newbie..hehhe