Thursday 11 April 2013

Pattern Chain Of Responsibility di Java, C# dan PHP

Design pattern masi menjadi bahasan di postingan kali ini, sekarang giliran pattern Chain of responsibility untuk ane posting dan contoh implementasinya di Java, C# dan PHP... sebenarnya pattern ini rencananya ane posting tadi pagi... berhubung tadi gak sempet jadi baru ane posting sekarang.. hari sudah sore dan ane pun belum pulang dari kampus... temen2 yang lain juga udah pada pulang, duduk ditemani dengan adik angkatan yang gak ane kenal :D ...
ya gapapalah... hidup itu butuh perjuangan dan pengorbanan.... chain of responsibility arti secara bahasa adalah rantai tanggung jawab.. sesuai namanya, pattern ini mempunyai konsep kerja seperti rantai yang mengolah beberapa proses yang tersambung... jadi pattern ini memungkinkan untuk membuat hubungan terikat antar object... object - object itu berisi sebuah proses, jika sebuah proses gagal menangani permasalahan maka akan dilanjutkan ke proses selanjutnya yang terikat dengan proses tersebut... begitu seterusnya... jika sebuah object berhasil menangani permasalahan maka tidak perlu melanjutkan ke proses selanjutnya... begitulah konsep kerja dari pattern ini yang berkategori design pattern behaviour..
sekarang saatnya ane implementasikan ke dalam program tentunya dengan Java, C# dan PHP :D

Java
package ChainOfResponsibility;

public class MainClass {
 public static void main(String[] args) {
  PlanetHandler planet = CiptakanSambunganRantai();
  planet.SambungRantai(Planet.Jupiter);
  planet.SambungRantai(Planet.Mars);
 }
 
 private static PlanetHandler CiptakanSambunganRantai(){
  PlanetHandler merkurius = new MerkuriusHandler();
  PlanetHandler bumi = new BumiHandler();
  PlanetHandler mars = new MarsHandler();
  
  merkurius.SetSuccessor(bumi);
  bumi.SetSuccessor(mars);
  
  return merkurius;
 }
}

abstract class PlanetHandler{
 PlanetHandler successor;
 public void SetSuccessor(PlanetHandler successor){
  this.successor = successor;
 }
 
 public abstract void SambungRantai(Planet planet);
}

enum Planet{
 Merkurius,Venus,Bumi,Mars,Jupiter,Uranus,Neptunus,Pluto;
}

class MerkuriusHandler extends PlanetHandler{
 @Override
 public void SambungRantai(Planet planet) {
  if(planet == Planet.Merkurius){
   System.out.println("Merkurius handler menghandle "+planet);
   System.out.println("Merkurius adalah planet terdekat dengan matahari");
  }else{
   System.out.println("Merkurius handler tidak menghandle "+planet);
   if(successor != null){
    successor.SambungRantai(planet);
   }
  }
 }
}

class BumiHandler extends PlanetHandler{
 @Override
 public void SambungRantai(Planet planet) {
  if(planet == Planet.Bumi){
   System.out.println("Bumi handler menghandle "+planet);
   System.out.println("Bumi adalah tempat tinggal manusia");
  }else{
   System.out.println("Bumi handler tidak menghandle "+planet);
   if(successor != null){
    successor.SambungRantai(planet);
   }
  }
 }
}

class MarsHandler extends PlanetHandler{
 @Override
 public void SambungRantai(Planet planet) {
  if(planet == Planet.Mars){
   System.out.println("Mars handler menghandle "+planet);
   System.out.println("Mars adalah tempat tinggal alien");
  }else{
   System.out.println("Mars handler tidak menghandle "+planet);
   if(successor != null){
    successor.SambungRantai(planet);
   }
  }
 }
}
  

C#
using System;

namespace Chain
{
 class Program
 {
  public static void Main(string[] args)
  {
   PlanetHandler planet = CiptakanSambunganRantai();
   planet.SambungRantai(Planet_.Planet.Jupiter);
   planet.SambungRantai(Planet_.Planet.Mars);
   Console.ReadKey(true);
  }
 
  private static PlanetHandler CiptakanSambunganRantai(){
   PlanetHandler merkurius = new MerkuriusHandler();
   PlanetHandler bumi = new BumiHandler();
   PlanetHandler mars = new MarsHandler();
   
   merkurius.SetSuccessor(bumi);
   bumi.SetSuccessor(mars);
   
   return merkurius;
  }
 }
 
 abstract class PlanetHandler{
  protected PlanetHandler successor;
  public void SetSuccessor(PlanetHandler successor){
   this.successor = successor;
  }
  
  public abstract void SambungRantai(Planet_.Planet planet);
 }
 
 class Planet_{
  public enum Planet{
   Merkurius,Venus,Bumi,Mars,Jupiter,Uranus,Neptunus,Pluto
  }
 } 
 
 class MerkuriusHandler : PlanetHandler{
  
  public override void SambungRantai(Planet_.Planet planet) {
   if(planet == Planet_.Planet.Merkurius){
    Console.WriteLine("Merkurius handler menghandle "+planet);
    Console.WriteLine("Merkurius adalah planet terdekat dengan matahari");
   }else{
    Console.WriteLine("Merkurius handler tidak menghandle "+planet);
    if(successor != null){
     successor.SambungRantai(planet);
    }
   }
  }
 }
 
 class BumiHandler : PlanetHandler{
  
  public override void SambungRantai(Planet_.Planet planet) {
   if(planet == Planet_.Planet.Bumi){
    Console.WriteLine("Bumi handler menghandle "+planet);
    Console.WriteLine("Bumi adalah tempat tinggal manusia");
   }else{
    Console.WriteLine("Bumi handler tidak menghandle "+planet);
    if(successor != null){
     successor.SambungRantai(planet);
    }
   }
  }
 }
 
 class MarsHandler : PlanetHandler{
  
  public override void SambungRantai(Planet_.Planet planet) {
   if(planet == Planet_.Planet.Mars){
    Console.WriteLine("Mars handler menghandle "+planet);
    Console.WriteLine("Mars adalah tempat tinggal alien");
   }else{
    Console.WriteLine("Mars handler tidak menghandle "+planet);
    if(successor != null){
     successor.SambungRantai(planet);
    }
   }
  }
 }
}  


PHP
<?php
 class EnumPlanet{
  static $planet = array(
   'Merkurius' => 'Merkurius',
   'Venus' => 'Venus',
   'Bumi' => 'Bumi',
   'Mars' => 'Mars',
   'Jupiter' => 'Jupiter',
   'Uranus' => 'Uranus',
   'Neptunus' => 'Neptunus',
   'Pluto' => 'Pluto'
  );
 }
 
 abstract class PlanetHandler{
  protected $successor;
  function SetSuccessor($successor){
   $this->successor = $successor;
  }  
  abstract function SambungRantai($planet);
 }
 
 class MerkuriusHandler extends PlanetHandler{  
  function SambungRantai($planet) {
   if($planet == EnumPlanet::$planet['Merkurius']){
    echo("Merkurius handler menghandle ".$planet.'< br />');
    echo("Merkurius adalah planet terdekat dengan matahari< br />");
   }else{
    echo("Merkurius handler tidak menghandle ".$planet.'< br />');
    if($this->successor != null){
     $this->successor->SambungRantai($planet);
    }
   }
  }
 }

 class BumiHandler extends PlanetHandler{  
  function SambungRantai($planet) {
   if($planet == EnumPlanet::$planet['Bumi']){
    echo("Bumi handler menghandle ".$planet.'<br />');
    echo("Bumi adalah tempat tinggal manusia< br />");
   }else{
    echo("Bumi handler tidak menghandle ".$planet.'< br />');
    if($this->successor != null){
     $this->successor->SambungRantai($planet);
    }
   }
  }
 }

 class MarsHandler extends PlanetHandler{  
  function SambungRantai($planet) {
   if($planet == EnumPlanet::$planet['Mars']){
    echo("Mars handler menghandle ".$planet.'< br />');
    echo("Mars adalah tempat tinggal alien< br />");
   }else{
    echo("Mars handler tidak menghandle ".$planet.'< br />');
    if($this->successor != null){
     $this->successor->SambungRantai($planet);
    }
   }
  }
 }
 
 function CiptakanSambunganRantai(){
  $merkurius = new MerkuriusHandler();
  $bumi = new BumiHandler();
  $mars = new MarsHandler();
  
  $merkurius->SetSuccessor($bumi);
  $bumi->SetSuccessor($mars);
  
  return $merkurius;
 }
 
 $planet = CiptakanSambunganRantai();
 $planet->SambungRantai(EnumPlanet::$planet['Jupiter']);
 $planet->SambungRantai(EnumPlanet::$planet['Mars']);
?>  
Hemmb... beginilah ceritanya design pattern responsibility... :) saling berkesinambungan antar prosesnya, ente tentunya bisa analisa sendiri ya ?? soalnya ini sudah sore dan ane mau pulang :D... cukup dulu yak ?? semoga bermanfaat.. keep cooding :)

No comments:

Post a Comment