Tutorial Design Pattern : Penerapan Design Pattern Mediator di PHP

Tak terasa liburan UTS sudah berakhir dan saya sudah kembali ke pulau seberang beberapa hari yang lalu dengan si Paijo, Jupiter MX baru yang larinya wushh..wushh… saat unjuk kebolehan di atas aspal hitam. Yaw walaupun motor sudah baru dan hape sudah android, tetap saja saya menyandang status jomblo #galau. Setelah si Rifky balikan kembali dengan pacarnya, tinggal saya saja yang malam ini galau di ITSolution. Syukurnya liburan UTS kemarin saya tidak sedang dilanda syndrom #galau, jadinya bisa produktif untuk ‘menyikat’ semua pekerjaan yang rencananya hasilnya akan saya gunakan untuk membeli sebuah tablet android. Yang murah-murah sajalah dan yang terpenting bisa dipake belajar ngoprek+testing aplikasi untuk layar beresolusi besar. Pengalaman ber-Android-nya pasti beda dengan hape galaxy gio yang sudah menemani saya beberapa bulan ini. Nah, di malam yang cuacanya acakadut ini saya akan melanjutkan postingan tentang design pattern. Sekarang saatnya membahas si mediator, design pattern yang berfungsi sebagai media perantara komunikasi antar class atau objek.

Design pattern mediator ini berfungsi untuk mengatur bagaimana satu set objek dapat berinteraksi/berkomunikasi. Biasanya di dalam sebuah aplikasi terdiri dari sejumlah class, dimana logikas aplikasi dan komputasi dijalankan di dalam class-class tersebut. Karena ruang lingkupnya adalah aplikasi, maka class-class tersebut akan saling berinteraksi. Dan ketika ada pengembangan/perawatan, maka proses interaksi antar class akan semakin kompleks. Bahkan mungkin kode-kode aplikasi akan menjadi lebih sulit dibaca dan dipahami (terutama untuk yang programmer yang statusnya beginner). Selain itu aplikasi akan lebih sulit untuk diubah, karena tiap perubahan yang dilakukan pada suatu class dapat mempengaruhi kinerja class yang lainnya. Maka dari itu digunakan pattern mediator sebagai perantara antar objek untuk saling berinteraksi. Dalam hal ini saya contohkan seperti sebuah pekerjaan untuk membuat aplikasi, dimana ada desainner interface dan programmer aplikasi. Mereka berdua tidak diperbolehkan berkomunikasi secara langsung, tapi berkomunikasi melalui job mediator dalam hal ini, project manager. Contoh yang lainnya ialah pada proses komunikasi antara pesawat dengan pesawat yang lainnya, dimana pesawat tidak langsung berkomunikasi, melainkan melalui sebuah perantara yaitu menara perantara yang ada di bandara. Sekarang kita coba untuk mengimplementasikannya ke dalam sebuah script PHP, seperti di bawah ini :

<?php

class JobMediator {
    private $design_obj;
    private $programming_obj;
    function __construct($design_in, $programming_in) {
      $this->design_obj = new JobDesign($design_in,$this);
      $this->programming_obj  = new JobProgramming($programming_in,$this);
    }
    function ambil_design() {return $this->design_obj;}
    function ambil_programming() {return $this->programming_obj;}
    function ubah(Job $ubah_pekerjaan) {
      if ($ubah_pekerjaan instanceof JobDesign) {
        if ($ubah_pekerjaan->ambil_status() == 'awal') {
          if ($this->ambil_programming()->ambil_status() != 'awal') {
            $this->ambil_programming()->set_programming_awal();
          }
        } elseif ($ubah_pekerjaan->ambil_status() == 'akhir') {
          if ($this->ambil_programming()->ambil_status() != 'akhir') {
            $this->ambil_programming()->set_programming_akhir();
          }
        }
      }
	  elseif ($ubah_pekerjaan instanceof JobProgramming) {
        if ($ubah_pekerjaan->ambil_status() == 'awal') {
          if ($this->ambil_design()->ambil_status() != 'awal') {
            $this->ambil_design()->set_design_awal();
          }
        } elseif ($ubah_pekerjaan->ambil_status() == 'akhir') {
          if ($this->ambil_design()->ambil_status() != 'akhir') {
            $this->ambil_design()->set_design_akhir();
          }
        }
      }
    }
}

abstract class Job {
    private $mediator;
    function __construct($mediator_in) {
        $this->mediator = $mediator_in;
    }
    function ambil_mediator() {return $this->mediator;}
    function ubah($ubah_pekerjaan) {
        ambil_mediator()->ubah($ubah_pekerjaan);
    }
}

class JobDesign extends Job {
    private $design;
    private $status;
    function __construct($design_in, $mediator_in) {
      $this->design = $design_in;
      parent::__construct($mediator_in);
    }
    function ambil_design() {return $this->design;}
    function set_design($design_in) {$this->design = $design_in;}
    function ambil_status() {return $this->status;}
    function set_status($status_in) {$this->status = $status_in;}
    function set_design_awal() {
      $this->set_design('+++'.strtoupper($this->ambil_design()).'+++');
      $this->set_status('awal');
      $this->ambil_mediator()->ubah($this);
    }
    function set_design_akhir() {
      $this->set_design('---'.strtolower($this->ambil_design()).'---');
      $this->set_status('akhir');
      $this->ambil_mediator()->ubah($this);
    }
}

class JobProgramming extends Job {
    private $programming;
    private $status;
    function __construct($programming_in, $mediator_in) {
        $this->programming = $programming_in;
        parent::__construct($mediator_in);
    }
    function ambil_programming() {return $this->programming;}
    function set_programming($programming_in) {$this->programming = $programming_in;}
    function ambil_status() {return $this->status;}
    function set_status($status_in) {$this->status = $status_in;}
    function set_programming_awal() {
        $this->set_programming('+++'.strtoupper($this->ambil_programming()).'+++');
        $this->set_status('awal');
        $this->ambil_mediator()->ubah($this);
    }
    function set_programming_akhir() {
        $this->set_programming('---'.strtolower($this->ambil_programming()).'---');
        $this->set_status('akhir');
        $this->ambil_mediator()->ubah($this);
    }
}

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

  $mediator = new JobMediator('Desain Layout Website', 'Coding Aplikasi');

  $design = $mediator->ambil_design();
  $programming = $mediator->ambil_programming();

  cetak('awal desain : ' . $design->ambil_design());
  cetak('awal programming: ' . $programming->ambil_programming());
  cetak('');

  $design->set_design_awal();

  cetak('Desain Awal');
  cetak('Desain: ' . $design->ambil_design());
  cetak('Programming: ' . $programming->ambil_programming());
  cetak('');

  $programming->set_programming_awal();

  cetak('Programming Awal');
  cetak('Desain: ' . $design->ambil_design());
  cetak('Programming: ' . $programming->ambil_programming());
  cetak('');

  $programming->set_programming_akhir();

  cetak('Programming Akhir');
  cetak('Desain: ' . $design->ambil_design());
  cetak('Programming: ' . $programming->ambil_programming());
  cetak('');

  $design->set_design_akhir();

  cetak('Desain Akhir');
  cetak('Desain: ' . $design->ambil_design());
  cetak('Programming: ' . $programming->ambil_programming());
  cetak('');

?>

Pada script di atas terdapat sebuah class JobMediator yang didalamnya mengatur bagaimana antar objek yang terbentuk dari class saling berkomunikasi dan melakukan perubahan keadaan/perilaku dari objek yang lainnya. Yaw walaupun coding-nya agak ruwet, tapi pattern mediator ini sangat efisien dari sisi pengembangan/perawatan ketika aplikasi yang sedang kita kembangkan sudah mulai kompleks dan interaksi antar objek/class sudah banyak. Lumayanlah, bisa diterapkan di aplikasi kecil-kecilan terlebih dahulu, siapa tau bisa jadi aplikasi yang besar :D. OK deh, sekian dulu postingan saya malam ini, semoga bisa bermanfaat untuk kita semua. Astungkara.

Happy Blogging and Keep Coding

Cheerrrss….!!!!

5 comments

  1. pandy Reply

    mas gede sya pengunjung lama,, hee..
    mas sya mw tnya… penerapan desaign patteren itu disebut metode gak dalam pemrograman?? tolong jawabnY yang jelas ya gan,,