Jumat, 12 Juli 2013

ADAPTER PATTERN


Adapter pattern adalah salah satu pattern yang termasuk ke dalam structural pattern.Adapter pattern berfungsi untuk menggunakan kembali method yang sudah digunakan pada kelas sebelumnya; terhadap kelas baru yang akan kita buat.
Dalam Adapter Pattern terdapat empat kelas: kelas adaptee, kelas adapter, kelas client, kelas target.
DIAGRAM KELAS ADAPTER PATTERN

PENENTUAN KELAS PADA ADAPTER PATTERN
Kelas Adaptee: merupakan kelas yang methodnya akan diadaptasi oleh kelas lainnya. Biasanya kelas ini akan diturunkan ke kelas Adapter. pada diagram kelas di atas. Kelas Adaptee adalah kelas Consultant.
Kelas Adapter: merupakan kelas yang meng-extends kelas Adaptee. Ciri paling umum dari kelas ini adalah memiliki method yang memanggil method di kelas adaptee. Pada diagram kelas diatas, kelas Adapter adalah kelas Employee Adapter.
Kelas Target: merupakan kelas yang diakses oleh kelas client. Biasanya target tidak menggunakan kelas namun hanya berupa interface. Kelas target pada diagram kelas diatas adalah kelas IEmployee.
Kelas Client: merupakan kelas yang mengakses kelas target. Dapat berupa kelas main dengan membuat objek yang berasal dari kelas target. Kelas Client pada diagram kelas diatas adalah kelas Program yang mengandung method main.

Berikut contoh program dari Adapter Pattern dalam bentuk c# :

/*
 * Created by SharpDevelop.
 * User: Atiek
 * Date: 7/13/2013
 * Time: 5:16 AM
 *
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
using System;
using System.Collections;

namespace Adapter_Pattern
{
  class Operasi
  {
  public void Perintah_Operasi()
   {
     Console.WriteLine("---> Memanggil Pasukan Perang");
   }
  }
class Sasaran
  {
public virtual void Pesan_Singkat()
   {
     Console.WriteLine("Memonitor Target sasaran tembak");
   }
  }
  class Adapter : Sasaran
  {  
   private Operasi operasi = new Operasi();
   public override void Pesan_Singkat()
   {
    operasi.Perintah_Operasi();
   }
  }
class Program
{
public static void Main(string[] args)
{
Console.WriteLine();
Console.WriteLine(" Implementasi Adapter Pattern");
Console.WriteLine(" ----------------------------");
Console.WriteLine("    "+DateTime.Now);
Console.WriteLine();
Console.WriteLine("Pemanggilan Class Target");
Sasaran sasaran = new Adapter();
Console.WriteLine();
sasaran.Pesan_Singkat();
Console.WriteLine();
Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
}
}



Hasil Running :


DECORATOR PATTERN
 Maksud dari pola ini adalah dengan menambahkan tanggung jawab tambahan secara dinamis untuk objek. Memperluas fungsionalitas obyek bisa dilakukan secara statis (pada saat kompilasi) dengan menggunakan warisan namun mungkin diperlukan untuk memperluas fungsi suatu objek secara dinamis (saat runtime) sebagai objek yang digunakan. Pola dekorator berlaku ketika ada kebutuhan untuk secara dinamis menambahkan serta menghapus tanggung jawab ke kelas, dan ketika subclassing tidak mungkin karena jumlah besar dari subclass yang dapat terjadi. Tujuan dari decorator pattern adalah menciptakan suatu mata rantai objek,  dimana setiap objek mempunyai object responsible  pada fungsi objek berikutnya. Konteks dari pola ini adalah diinginkan untuk memperkaya behaviour dari suatu class, objek komponen  terdekorasi bisa digunakan sama seperti  objek komponen biasa, tanggung jawab dari proses dekorasi tidak diinginkan  ada pada class  komponen, kemungkinan ada proses dekorasi yang ditambahkan di masa depan yang tak bisa diperkirakan dan harus diantisipasi.
Tujuan Pattern ini adalah  menciptakan suatu mata rantai object, dimana setiap object mempunyai objects responsible pada fungsi objek berikutnya.( The  Decorator  attaches additional responsibilities to an object dynamically.)
Kelas peserta dalam pola dekorator adalah:
a.     Komponen - Interface untuk benda yang dapat memiliki tanggung jawab ditambahkan kepada mereka secara dinamis.
b.     ConcreteComponent - Mendefinisikan sebuah objek yang tanggung jawab tambahan dapat ditambahkan.
c.     Dekorator - Menjaga referensi ke objek Komponen dan mendefinisikan antarmuka yang sesuai dengan antarmuka Komponen ini.
d.     Dekorator Beton - Beton dekorator memperluas fungsionalitas komponen dengan menambahkan negara atau menambahkan perilaku.
Contoh Code dalam decorator pattern dalam c# :


/*
 * Created by SharpDevelop.
 * User: Atiek
 * Date: 7/13/2013
 * Time: 5:21 AM
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
using System;
using System.Collections;

namespace Decorator_Pattern
{
// Class Operator Matematika atau Component
 abstract class Operator_Matematika
 {
    public abstract void Operasi();
 }

 // Class Perkalian atau Object Component Perkalian
 class Operator_Perkalian : Operator_Matematika
 {
   public override void Operasi()
   {
    Console.WriteLine("Menggunakan Operator Perkalian");
    Console.WriteLine("------------------------------");
   }
 }

 // Menciptakan class abstract Perkalian atau Decorator
 abstract class Perkalian : Operator_Matematika
 {
   protected Operator_Matematika operator_Matematika;

   public void Pasang_Operator(Operator_Matematika operator_Matematika)
   {
    this.operator_Matematika = operator_Matematika;      
   }

   public override void Operasi()
   {
     if (operator_Matematika != null)
     {
       operator_Matematika.Operasi();
     }
   }
 }

 // Concrete Decorator Perkalian Bilangan Ganjil
 class Perkalian_Ganjil : Perkalian
 {
   private string operator_mtk = "";

   public override void Operasi()
   {
     base.Operasi();
     operator_mtk = "Operator Perkalian ( X )";
     Console.WriteLine(operator_mtk);
     Console.WriteLine();
     Console.WriteLine("Perkalian Ganjil");
     Console.WriteLine("Isi Data Perkalian Ganjil");
     int a,b;
     int c = 0;
     Console.Write("Input Bil Ganjil A = ");
     a=Convert.ToInt32(Console.ReadLine());
     Console.Write("Input Bil Ganjil B = ");
     b=Convert.ToInt32(Console.ReadLine());
     c = a * b;
     Console.WriteLine("Hasil Perkalian Bil Ganjil = {0}",c);
     Console.WriteLine();
   }
 }

 // Concrete Decorator Perkalian Bilangan Ganjil
 class Perkalian_Genap : Perkalian
 {
  void Perkalian_Bil_Genap()
   {
  Console.WriteLine("Perkalian Genap");
   }
   public override void Operasi()
   {
     base.Operasi();
     Perkalian_Bil_Genap();
     Console.WriteLine("Isi Data Perkalian Genap");
     int x,y;
     int z = 0;
     Console.Write("Input Bil Genap X = ");
     x=Convert.ToInt32(Console.ReadLine());
     Console.Write("Input Bil Genap Y = ");
     y=Convert.ToInt32(Console.ReadLine());
     z = x * y;
     Console.WriteLine("Hasil Perkalian Bil Ganjil = {0}",z);
     
   }    
 }


class Program
{
public static void Main(string[] args)
{
Console.WriteLine(" Operasi Matematika");
Console.WriteLine("");
 // Menciptakan Product Perkalian dengan 2 jenis Bilangan yaitu Ganjil dan Genap 
     Operator_Perkalian op_Perkalian = new Operator_Perkalian();      
     Perkalian_Ganjil ganjil = new Perkalian_Ganjil();      
     Perkalian_Genap genap = new Perkalian_Genap();

     // Pemanggilan Class Perkalian
     ganjil.Pasang_Operator(op_Perkalian);     
     genap.Pasang_Operator(ganjil);      
     genap.Operasi();
     Console.WriteLine();
Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
}
}

Hasil Running :



PROXY PATTERN
Dalam pemrograman komputer, pola proxy adalah pola desain perangkat lunak. Proxy dalam bentuk yang paling umum adalah fungsi kelas sebagai sebuah antarmuka untuk sesuatu yang lain. Proxy bisa antarmuka untuk apa saja: koneksi jaringan, sebuah objek besar di memori, file, atau beberapa sumber daya lain yang mahal atau tidak mungkin untuk menduplikasi.
Sebuah contoh yang terkenal dari pola proxy adalah referensi menghitung objek pointer. Dalam situasi di mana beberapa salinan obyek yang kompleks harus ada pola proxy dapat disesuaikan dengan menggabungkan pola flyweight untuk mengurangi jejak memori aplikasi. Biasanya, satu contoh dari objek yang kompleks dan  beberapa objek proxy yang diciptakan, yang semuanya mengandung referensi ke obyek yang kompleks tunggal (asli). Setiap operasi yang dilakukan pada proxy akan diteruskan ke objek asli. Setelah semua contoh proxy berada di luar ruang lingkup, memori obyek yang kompleks yang mungkin akan deallocated.
Contoh Code dalam proxy pattern dalam c# :

/*
 * Created by SharpDevelop.
 * User: Atiek
 * Date: 7/13/2013
 * Time: 5:31 AM
 *
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
using System;
using System.Collections;

namespace Proxy_Pattern
{

// "Subject Class Sekolah"
  abstract class Sekolah_SMP
  {
    public abstract void Pendaftaran();  
  }

  // "RealSubject Class Data Siswa Baru"
  class Siswa_Baru : Sekolah_SMP
  {
    public override void Pendaftaran()
    {
     string dt="dt";
     Console.WriteLine("Proses Pendaftaran Siswa Baru 2013");
     Console.WriteLine("-----------------------------------");
     string[] nama = new string[dt.Length];
     string[] alamat = new string[dt.Length];
     string[] tgl_lahir = new string[dt.Length];
     string[] sekolah_asal = new string[dt.Length];
     for (int y=0;y<dt.Length;y++)
     {
      Console.Write("Isi Nama Pendaftar                   : ");
      nama[y] = Convert.ToString(Console.ReadLine());
       Console.Write("Isi Alamat Pendaftar                 : ");
       alamat[y] = Convert.ToString(Console.ReadLine());
      Console.Write("Isi Tempat & Tanggal Lahir Pendaftar : ");
      tgl_lahir[y] = Convert.ToString(Console.ReadLine());
      Console.Write("Isi Sekolah Asal Pendaftar           : ");
      sekolah_asal[y] = Convert.ToString(Console.ReadLine());
      Console.WriteLine("");
     }
   
     Console.WriteLine();
     Console.WriteLine("    Nama        Alamat       Tgl. Lahir      Asal Sekolah");
     Console.WriteLine("|-----------|------------|-------------------|---------------|");
     for (int z=0;z<dt.Length;z++)
     {
      Console.Write("   {0}",nama[z]);
      Console.Write("     {0}",alamat[z]);
      Console.Write("    {0}",tgl_lahir[z]);
      Console.Write("    {0}",sekolah_asal[z]);
      Console.WriteLine();
     }        
    }
  }

  // "Proxy Pusat Data Dinas Pendidikan"
  class Proxy_Dinas_Pendidikan : Sekolah_SMP
  {
    Siswa_Baru siswa_Baru;

    public override void Pendaftaran()
    {
      // Inisialisasi Pemanggilan Methode Yang Memiliki Data Siswa
      if (siswa_Baru == null)
      {
        siswa_Baru = new Siswa_Baru();
      }
        siswa_Baru.Pendaftaran();    
    }
  }

class Program
{
public static void Main(string[] args)
{
// Menciptakan Proxy dan Memminta Layanan Data
     Proxy_Dinas_Pendidikan proxy_Dinas = new Proxy_Dinas_Pendidikan();
     proxy_Dinas.Pendaftaran();
     Console.WriteLine();

Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
}
}

Hasil Running :



STRATEGY PATTERN
Saya mulai dulu dengan Strategy Pattern ya, Strategy Pattern pattern memiliki nama lain yaitu Policy Pattern. Menurut GoF, Staretegy Pattern yaitu :
Define a family of algorithms, encapsulate each one, and make them interchangeable.
Strategy lets the algorthm vary independently from client that use it.
Jadi strategy pattern digunakan untuk mengelompokkan sejumlah algoritma, mengenskapsulasinya menjadi sebuah objek, dimana nantinya kita bisa mempertukarkan objek tersebut. Hal ini berarti kita dapat merubah atau mempertukarkan algoritma tersebut secara dinamis pada saat aplikasi sedang berjalan. Strategy pattern sangat membantu dalam memelihara kode program, karena ketika kita memiliki banyak algoritma maka aplikasi akan semakin kompleks dan tentu saja akan sangat sulit memelihara kode program kita. Lagi pula dengan mengenkapsulasi algoritma mejadi sebuah kelas, kita bisa menggunakan algoritma tersebut kapan pun bila dibutuhkan.




Contoh Code dalam strategy pattern dalam c# :


/*
 * Created by SharpDevelop.
 * User: Atiek
 * Date: 7/13/2013
 * Time: 5:49 AM
 *
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
using System;

namespace Strategy_Pattern
{
// "Strategy"
  abstract class Strategy
  {
    public abstract void AlgorithmInterface();
  }

  // "ConcreteStrategyA"
  class ConcreteStrategyA : Strategy
  {
    public override void AlgorithmInterface()
    {
      Console.WriteLine(" Membuat Strategy A");
      Console.WriteLine("        Algoritma Caesar Chiper");
    }
  }

  // "ConcreteStrategyB"
  class ConcreteStrategyB : Strategy
  {
    public override void AlgorithmInterface()
    {
      Console.WriteLine(" Membuat Strategy B");
      Console.WriteLine("        Algoritma Vigenere Chiper");
    }
  }

  // "ConcreteStrategyC"
  class ConcreteStrategyC : Strategy
  {
    public override void AlgorithmInterface()
    {
      Console.WriteLine(" Membuat Strategy C");
      Console.WriteLine("        Algoritma Elgamal");
    }
  }
  // "ConcreteStrategyD"
  class ConcreteStrategyD : Strategy
  {
    public override void AlgorithmInterface()
    {
      Console.WriteLine(" Membuat Strategy D");
      Console.WriteLine("        Algoritma Vernam Chiper");
    }
  }

  // "Context"
  class Context
  {
    Strategy strategy;

    // Constructor
    public Context(Strategy strategy)
    {
      this.strategy = strategy;
    }

    public void ContextInterface()
    {
      strategy.AlgorithmInterface();
    }
  }


class Program
{
public static void Main(string[] args)
{
Console.WriteLine(" Strategy Pattern In CSharp");
Console.WriteLine(" --------------------------");
Context context;

     // Three contexts following different strategies
     context = new Context(new ConcreteStrategyA());
     context.ContextInterface();

     context = new Context(new ConcreteStrategyB());
     context.ContextInterface();

     context = new Context(new ConcreteStrategyC());
     context.ContextInterface();
   
     context = new Context(new ConcreteStrategyD());
     context.ContextInterface();
     Console.WriteLine();
Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
}
}

Hasil Running :

BRIDGE PATTERN
"Memisahkan sebuah abstraksi dari pelaksanaannya sehingga dua dapat bervariasi secara independen" adalah niat untuk jembatan pola desain seperti yang dinyatakan oleh GOF.
Pola desain jembatan adalah versi modifikasi dari gagasan "lebih memilih komposisi atas warisan".

Elemen Bridge Pola Desain

  • Abstraksi - inti dari pola desain jembatan dan mendefinisikan inti masalahnya. Berisi referensi ke pelaksana.
  • Refined Abstraksi - Memperpanjang abstraksi mengambil detail halus satu tingkat di bawah. Menyembunyikan unsur-unsur halus dari implemetors.
  • Pelaksana - Interface ini adalah tingkat higer daripada abstraksi. Hanya mendefinisikan operasi dasar.
  • Beton Implementasi - Mengimplementasikan pelaksana atas dengan menyediakan implementasi konkret.

Struktur :

Abstraksi
mendefinisikan antarmuka abstrak
mempertahankan referensi Implementor.
RefinedAbstraction
memperluas antarmuka yang didefinisikan oleh Abstraksi
Implementor
mendefinisikan antarmuka untuk kelas implementasi
ConcreteImplementor
mengimplementasikan interface Implementor

Contoh Code dalam bridge pattern dalam c# :

/*
 * Created by SharpDevelop.
 * User: Atiek
 * Date: 7/13/2013
 * Time: 5:18 AM
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
using System;

namespace Bridge_Pattern
{
abstract class Penerjemah  
  {
public abstract void Operasi();    
  }
class Abstraksi  
  {
protected Penerjemah penerjemah;    
    public Penerjemah Penerjemah   
   {
      set{ penerjemah = value; }
   }
    public virtual void Operasi()   
   {
    penerjemah.Operasi();      
   }
  }
class PenentuanAbstraksi : Abstraksi  
  {
public override void Operasi()
    {
penerjemah.Operasi();      
    }
 

  class PembuatPenerjemah : Penerjemah  
  {
  public override void Operasi()   
   {
      Console.WriteLine("Menjalankan Bahasa Inggris");
   }
  }  
  class PembuatPenerjemah_2 : Penerjemah
  {
  public override void Operasi()    
   {
      Console.WriteLine("Menjalankan Bahasa Jerman");
   }
  }

class Program
{
public static void Main(string[] args)
{
Console.WriteLine();
Console.WriteLine(" Implementasi Bridge Pattern");
Console.WriteLine(" ----------------------------");
Console.WriteLine("    "+DateTime.Now);
Console.WriteLine();
Abstraksi abs = new PenentuanAbstraksi();
// Memanggil dan menyetting Penerjemah 
    abs.Penerjemah = new PembuatPenerjemah();  
      abs.Operasi();
    // Memanggil dan menjalankan Penerjemah 
      abs.Penerjemah = new PembuatPenerjemah_2();   
      abs.Operasi();
     
      Console.WriteLine();
Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
}
}

Hasil Running :





Tidak ada komentar:

Posting Komentar