Pages

Selasa, 10 Juli 2012

Composite Pattern

composite pattern. Salah satu contoh aplikasi semisal, Microsoft Office Visio memungkinkan pengguna untuk dapat membuat berbagai bentuk semisal kotak, lingkaran, dan sebagainya. Kemudian pengguna dapat melakukan grouping terhadap bentuk-bentuk yang ada dan ketika group tersebut dipindahkan posisinya, otomatis semua shape yang ada dalam group tersebut ikut berpindah posisinya. Pengguna juga dapat melakukan grouping kembali terhadap group shape yang ada dengan shape-shape yang lain sehingga dapat terbentuk semacam hierarki pada shape yang ada. Bentuk-bentuk permasalahan semacam inilah yang dapat diselesaikan dengan Composite Pattern.
Sebagai kelanjutan dari postingan Strategy Pattern, kali ini program sederhana tersebut akan dikembangkan sehingga program tersebut dapat melakukan grouping terhadap shape kotak, lingkaran dan garis. Langkah-langkah yang harus dilakukan adalah sebagai berikut:

  1. Buat sebuah class Komposisi yang merupakan group dari shape yang ada
  2. 01///
    02/// Author: Jeffrey Hermanto Halimsetiawan
    03///
    04public class Komposisi : Shape
    05{
    06    private Point _origin;
    07
    08    private List _gambar;
    09
    10    public Point Origin
    11    {
    12        get
    13        {
    14            return _origin;
    15        }
    16        set
    17        {
    18            _origin = value;
    19        }
    20    }
    21
    22    public Komposisi()
    23    {
    24        _gambar = new List();
    25    }
    26
    27    public void Add(Shape s)
    28    {
    29        _gambar.Add(s);
    30    }
    31
    32    public void Remove(Shape s)
    33    {
    34        _gambar.Remove(s);
    35    }
    36
    37    public override void Draw(System.Drawing.Graphics g)
    38    {
    39        foreach (Shape s in _gambar)
    40        {
    41            s.Draw(g, _origin);
    42        }
    43    }
    44
    45    public override void Draw(System.Drawing.Graphics g, Point origin)
    46    {
    47        Point newOrigin = new Point(origin.X + _origin.X,
    48                                    origin.Y + _origin.Y);
    49        foreach (Shape s in _gambar)
    50        {
    51            s.Draw(g, newOrigin);
    52        }
    53    }
    54}
  3. Tambahkan abstract method Draw(Graphics g, Point origin) untuk mengatasi penggambaran Komposisi dimana posisi dari shape nya adalah posisi komposisi ditambah dengan posisi relatif shape tersebut terhadap posisi (0,0) Komposisi.
  4. 1///
    2/// Author: Jeffrey Hermanto Halimsetiawan
    3///
    4public abstract class Shape
    5{
    6    public abstract void Draw(Graphics g);
    7    public abstract void Draw(Graphics g, Point origin);
    8}
  5. Implementasikan method Draw(Graphics g, Point origin) pada Kotak
  6. 01///
    02/// Author: Jeffrey Hermanto Halimsetiawan
    03///
    04public class Kotak : Shape
    05{
    06    private Point _kiriAtas;
    07    private Point _kananBawah;
    08
    09    public Point KananBawah
    10    {
    11        get
    12        {
    13            return _kananBawah;
    14        }
    15        set
    16        {
    17            _kananBawah = value;
    18        }
    19    }
    20
    21    public Point KiriAtas
    22    {
    23        get
    24        {
    25            return _kiriAtas;
    26        }
    27        set
    28        {
    29            _kiriAtas = value;
    30        }
    31    }
    32
    33    public override void Draw(System.Drawing.Graphics g)
    34    {
    35        Draw(g, new Point(0, 0));
    36    }
    37
    38    public override void Draw(System.Drawing.Graphics g, Point origin)
    39    {
    40        Pen pen = new Pen(new SolidBrush(Color.Brown));
    41
    42        Point t1 = new Point(origin.X + _kiriAtas.X,
    43                             origin.Y + _kiriAtas.Y);
    44        Point t2 = new Point(origin.X + _kananBawah.X,
    45                             origin.Y + _kananBawah.Y);
    46
    47        g.DrawRectangle(pen, t1.X,
    48                             t1.Y,
    49                             t2.X - t1.X,
    50                             t2.Y - t1.Y);
    51    }
    52}
  7. Implementasikan method Draw(Graphics g, Point origin) pada Lingkaran
  8. 01///
    02/// Author: Jeffrey Hermanto Halimsetiawan
    03///
    04public class Lingkaran : Shape
    05{
    06    private Point _pusat;
    07    private int _radius;
    08
    09    public Point Pusat
    10    {
    11        get
    12        {
    13            return _pusat;
    14        }
    15        set
    16        {
    17            _pusat = value;
    18        }
    19    }
    20
    21    public int Radius
    22    {
    23        get
    24        {
    25            return _radius;
    26        }
    27        set
    28        {
    29            _radius = value;
    30        }
    31    }
    32
    33    public override void Draw(System.Drawing.Graphics g)
    34    {
    35        Draw(g, new Point(0, 0));
    36    }
    37
    38    public override void Draw(System.Drawing.Graphics g, Point origin)
    39    {
    40        Pen pen = new Pen(new SolidBrush(Color.DarkGreen));
    41
    42        Point tp = new Point(origin.X + _pusat.X,
    43                             origin.Y + _pusat.Y);
    44
    45        g.DrawEllipse(pen, tp.X - _radius,
    46                           tp.Y - _radius,
    47                           _radius * 2,
    48                           _radius * 2);
    49    }
    50}
  9. Implementasikan method Draw(Graphics g, Point origin) pada Garis
  10. 01///
    02/// Author: Jeffrey Hermanto Halimsetiawan
    03///
    04public class Garis : Shape
    05{
    06    private Point _titik1;
    07    private Point _titik2;
    08
    09    public Point Titik1
    10    {
    11        get
    12        {
    13            return _titik1;
    14        }
    15        set
    16        {
    17            _titik1 = value;
    18        }
    19    }
    20
    21    public Point Titik2
    22    {
    23        get
    24        {
    25            return _titik2;
    26        }
    27        set
    28        {
    29            _titik2 = value;
    30        }
    31    }
    32
    33    public override void Draw(System.Drawing.Graphics g)
    34    {
    35        Draw(g, new Point(0, 0));
    36    }
    37
    38    public override void Draw(System.Drawing.Graphics g, Point origin)
    39    {
    40        Pen pen = new Pen(new SolidBrush(Color.Magenta));
    41
    42        Point t1 = new Point(origin.X + _titik1.X,
    43                             origin.Y + _titik1.Y);
    44        Point t2 = new Point(origin.X + _titik2.X,
    45                             origin.Y + _titik2.Y);
    46
    47        g.DrawLine(pen, t1, t2);
    48    }
    49}
  11. Mengubah inisialisasi Shape yang ada pada method InitializeShape() dengan memanfaatkan class Komposisi
  12. 01///
    02/// Author: Jeffrey Hermanto Halimsetiawan
    03/// Untuk melakukan inisialisasi shape yang ada
    04///
    05private void InitializeShape()
    06{
    07    Komposisi kp = new Komposisi();
    08    kp.Origin = new Point(500, 100);
    09
    10    Kotak k = new Kotak();
    11    k.KiriAtas = new Point(10, 10);
    12    k.KananBawah = new Point(110, 110);
    13    kp.Add(k);
    14
    15    Lingkaran l = new Lingkaran();
    16    l.Pusat = new Point(60, 60);
    17    l.Radius = 30;
    18    kp.Add(l);
    19
    20    Garis g = new Garis();
    21    g.Titik1 = new Point(81, 39);
    22    g.Titik2 = new Point(39, 81);
    23    kp.Add(g);
    24
    25    Komposisi kp2 = new Komposisi();
    26    kp2.Origin = new Point(10, 200);
    27    kp2.Add(k);
    28    kp2.Add(l);
    29    kp2.Add(g);
    30
    31    _gambar.Add(kp);
    32    _gambar.Add(kp2);
    33
    34}
Secara umum, class diagram dari program ini adalah sebagai berikut:
Class Diagram Simple Composite
Class Diagram Simple Composite
Output dari program di atas adalah sebagai berikut:
Output Simple Composite
Output Simple Composite
Tentunya, pattern ini akan sangat berguna sekali dalam menyelesaikan permasalahan yang hierarkial.

0 komentar:

Posting Komentar