Skip to content
10 Oktober 2010 / Jeffrey Hermanto Halimsetiawan

[Pola dan Arsitektur Perangkat Lunak] Decorator Pattern


Adakalanya seorang programmer menghadapi permasalahan dimana suatu class mempunyai banyak spesifikasi sehingga suatu class di-inherit hingga bertingkat-tingkat. Sebagai contoh, diambil kasus permainan “cannibal and missionary” dimana setiap cannibal ataupun missionary ada yang besenjata dan tidak bersenjata. Kemungkinan besar pendekatan yang dilakukan adalah membuat abstract class Character yang nantinya akan di-inherit menjadi class Cannibal dan Missionary. Nantinya, class Cannibal akan diturunkan menjadi ArmedCannibal dan UnarmedCannibal, sedangkan class Missionary akan diturunkan menjadi ArmedMissionary dan UnarmedMissionary. Hal itu tentunya akan menimbulkan efek multiplikatif terhadap jumlah kelas yang ada setiap terjadi penambahan tipe pada setiap karakter.

Bad Example - Class Diagram Simple Decorator

Bad Example - Class Diagram Simple Decorator

Untuk mengatasi masalah multiplikatif  tersebut, perlu dilakukan penyederhanaan agar turunan dari class tersebut tidak bercabang-cabang membentuk sebuah tree dengan decorator pattern. Langkah-langkah yang harus dilakukan adalah:

  1. Mendefinisikan abstract class Character sebagai base class dari semua karakter yang ada.
  2. /// <summary>
    /// Author : Jeffrey Hermanto Halimsetiawan
    /// </summary>
    public abstract class Character
    {
        public abstract void Draw(Graphics g);
    }
    
  3. Mendefinisikan class Cannibal dan Missionary yang merupakan turunan dari class Character.
  4. /// <summary>
    /// Author : Jeffrey Hermanto Halimsetiawan
    /// </summary>
    public class Cannibal : Character
    {
        public override void Draw(System.Drawing.Graphics g)
        {
    
        }
    }
    
    /// <summary>
    /// Author : Jeffrey Hermanto Halimsetiawan
    /// </summary>
    public class Missionary : Character
    {
        public override void Draw(System.Drawing.Graphics g)
        {
    
        }
    }
    
  5. Mendefinisikan abstract class Decorator yang merupakan turunan dari class Character, kelas ini nantinya akan menjadi base class dari tipe-tipe karakter yang ada seperti: Armed, Immortal dan lain sebagainya. Karena kelas Decorator nantinya hanya melakukan dekorasi terhadap karakter yang ada, tentunya abstract class ini memiliki asosiasi terhadap class Character.
  6. /// <summary>
    /// Author : Jeffrey Hermanto Halimsetiawan
    /// </summary>
    public abstract class Decorator : Character
    {
        private Character _char;
    
        public Decorator(Character mainChar)
        {
            _char = mainChar;
        }
    }
    
  7. Mendefinisikan kelas-kelas yang merupakan turunan dari Decorator dan menunjukkan tipe ataupun spesialiasasi dari karakter, seperti: Armed, Immortal, dan Amphibious.
  8. /// <summary>
    /// Author : Jeffrey Hermanto Halimsetiawan
    /// </summary>
    public class Armed : Decorator
    {
        public Armed(Character mainChar)
            : base(mainChar)
        {
    
        }
    
        public override void Draw(System.Drawing.Graphics g)
        {
    
        }
    
        private void DrawArmed(System.Drawing.Graphics g)
        {
    
        }
    }
    
    /// <summary>
    /// Author : Jeffrey Hermanto Halimsetiawan
    /// </summary>
    public class Immortal : Decorator
    {
        public Immortal(Character mainChar)
            : base(mainChar)
        {
    
        }
    
        public override void Draw(System.Drawing.Graphics g)
        {
    
        }
    
        private void DrawImmortal(System.Drawing.Graphics g)
        {
    
        }
    }
    
    /// <summary>
    /// Author : Jeffrey Hermanto Halimsetiawan
    /// </summary>
    public class Amphibious : Decorator
    {
        public Amphibious(Character mainChar)
            : base(mainChar)
        {
    
        }
    
        public override void Draw(System.Drawing.Graphics g)
        {
    
        }
    
        private void DrawAmphibious(System.Drawing.Graphics g)
        {
    
        }
    }
    
  9. Definisikan sebuah method InitializeCharacter() yang nantinya akan meng-instantiate karakter yang ada.
  10. /// <summary>
    /// Author : Jeffrey Hermanto Halimsetiawan
    /// </summary>
    public void InitializeCharacter()
    {
        Character am = new Armed(new Missionary());
        am = new Amphibious(am);
    }
    

    Dari pendefinisian di atas, sebenarnya terbentuk rangkaian objek seperti linkedlist sebagai berikut:

    Decorator Object

    Decorator Object

Secara umum, class diagram dari program ini adalah sebagai berikut:

Class Diagram Simple Decorator

Class Diagram Simple Decorator

  1. yusuf / Jun 15 2011 20:24

    bagus bos, tingkatkan terus .. maju java..

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: