[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.
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:
- Mendefinisikan abstract class Character sebagai base class dari semua karakter yang ada.
- Mendefinisikan class Cannibal dan Missionary yang merupakan turunan dari class Character.
- 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.
- Mendefinisikan kelas-kelas yang merupakan turunan dari Decorator dan menunjukkan tipe ataupun spesialiasasi dari karakter, seperti: Armed, Immortal, dan Amphibious.
- Definisikan sebuah method InitializeCharacter() yang nantinya akan meng-instantiate karakter yang ada.
/// <summary>
/// Author : Jeffrey Hermanto Halimsetiawan
/// </summary>
public abstract class Character
{
public abstract void Draw(Graphics g);
}
/// <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)
{
}
}
/// <summary>
/// Author : Jeffrey Hermanto Halimsetiawan
/// </summary>
public abstract class Decorator : Character
{
private Character _char;
public Decorator(Character mainChar)
{
_char = mainChar;
}
}
/// <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)
{
}
}
/// <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:
Secara umum, class diagram dari program ini adalah sebagai berikut:







bagus bos, tingkatkan terus .. maju java..