Tutorial Design Pattern : Penerapan Design Pattern State di PHP

Baru bangun dari tidur siang yang lumayan nyenyak dan sudah lama tidak saya rasakan. Mata masih 5 watt, langsung buka laptop+konek ke wi-fi rumah yang berhasil saya crack beberapa hari yang lalu :D. Buka beranda facebook, langsung deh ada si Rifky yang mengirimkan pesan. Dia dapat proyek’an, sesuatu yang sudah lama diidam-idamkan olehnya. Niatnya sih pengen konsultasi ke saya, tapi pas di pertengahan dia malah ngeliatin pesan dari mantannya dan bisa ditebak dia sedang #galau tingkat akut :ngakaks:. Yuppzzz, saya juga pernah #galau seperti dia dikala ada pekerjaan yang harus segera dikerjakan. Tapi itulah tantangannya, sesuatu yang emang harus dirasakan oleh semua orang. Untuk menemani kegalauan para #galauersSejati malam ini, saya akan melanjutkan postingan berseri tentang design pattern, semoga rekan-rekan tidak bosan dengan postingan saya yang bertemakan design pattern selama beberapa hari ini. Semua ini demi tugas dari pak dosen yang harus segera diselesaikan. Malam ini saya akan membahas tentang design pattern State, yang dapat melakukan perubahan perilakunya di dalam state internal.

Design pattern State ini memungkinkan object untuk melakukan perubahan perilakunya ketika terjadi perubahan di bagian internal State, object akan muncul untuk mengubah perilaku classnya. Contohnya pada sebuah mesin ATM yang mempunyai state mengetahui jumlah uang yang ada di dalamnya, kemampuan terkoneksi dengan server pusat dan yang lainnya. Ketika ada pengguna yang ingin melakukan tarik tunai, maka ada beberapa perubahan dan perilaku yang mungkin dilakukan, yaitu :

  • Menerima kartu atm, mengeluarkan uang, melakukan perubahan di server pusat
  • Menerima kartu atm, tidak mengeluarkan uang (stok uang habis di atm tersebut), tidak melakukan perubahan di server pusat
  • Tidak menerima kartu atm (tidak sesuai bank), tidak mengeluarkan uang, tidak melakukan perubahan di server pusat. dll

Saya contohkan yang lainnya, yang lebih familiar dan mungkin sering dialami oleh para #galauersSejati, yaitu tentang perasaan cinta yang kadang naik turun dan berubah-ubah sesuai dengan perilaku yang dilakukan oleh pasangan :D. Seperti di sistem digital, yaitu 0 dan 1. Sekarang kita coba untuk menerapkannya ke dalam script PHP yang mungkin kodenya terlihat agak #galau :p :

<?php
interface CintaState {
	public function tampilkan(CintaKu $cintaKu, $isi);
}

class CintaKecil implements CintaState {
	public function tampilkan(CintaKu $cintaKu, $isi) {
		echo strtolower('<b>'.$isi.'</b> - kecil <br>');
		$cintaKu->aturCintaKu(new CintaBesar());
	}
}

class CintaBesar implements CintaState {
	private $hit=0;
	public function tampilkan(CintaKu $cintaKu, $isi){
		echo strtoupper('<b>'.$isi.'</b> - besar <br>');
		if($this->hit>0) {
			 $cintaKu->aturCintaKu(new CintaKecil());
		}
		$this->hit++;
	}
}

class CintaKu {
	private $myLove;
	public function __construct() {
			$this->aturCintaKu(new CintaKecil());
	}

       	public function aturCintaKu(CintaState $newState) {
		$this->myLove = $newState;
	}

	public function tampilkan($isi) {
			$this->myLove->tampilkan($this,$isi);
	}
}

	$cinta = new CintaKu();
	$cinta->tampilkan("aku");
	$cinta->tampilkan("tetap");
	$cinta->tampilkan("sayang");
	$cinta->tampilkan("kamu");
	$cinta->tampilkan("walau");
	$cinta->tampilkan("kamu");
	$cinta->tampilkan("pernah");
	$cinta->tampilkan("lempar");
	$cinta->tampilkan("duit");
	$cinta->tampilkan("ke");
	$cinta->tampilkan("wajahku");
?>

Pada script di atas, setiap counter menunjukkan nilai lebih besar dari 0, maka state yang awalnya berada di CintaBesar langsung berpindah ke state CintaKecil. Dan hanya sekali berada state CintaKecil, karena langsung diarahkan ke state CintaBesar lagi. Nah, itu kita ibaratkan saja seperti sepasang kekasih yang dalam hubungannya sering bertengkar dan berada di titik tinggi, sedangkan akurnya hanya sebentar saja :D. Gampang kan penerapannya…??? OK deh, sekian dulu postingan design pattern kali ini yang kodenya agak melow-melow gimana gitu. Semoga bisa bermanfaat untuk kita semua.

Happy Blogging and Keep Coding

Cheerrrss….!!!!