Translate


Secara tidak sadar, berbagai program yang seringkali digunakan ternyata menggunakan 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
01
///
02
/// Author: Jeffrey Hermanto Halimsetiawan

03
///
04
public 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
}
  1. 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.
1
///
2
/// Author: Jeffrey Hermanto Halimsetiawan

3
///
4
public abstract class Shape

5
{
6
    public abstract void Draw(Graphics g);

7
    public abstract void Draw(Graphics g, Point origin);
8
}
  1. Implementasikan method Draw(Graphics g, Point origin) pada Kotak
01
///
02
/// Author: Jeffrey Hermanto Halimsetiawan

03
///
04
public 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
}
  1. Implementasikan method Draw(Graphics g, Point origin) pada Lingkaran
01
///
02
/// Author: Jeffrey Hermanto Halimsetiawan

03
///
04
public 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
}
  1. Implementasikan method Draw(Graphics g, Point origin) pada Garis
01
///
02
/// Author: Jeffrey Hermanto Halimsetiawan

03
///
04
public 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
}
  1. Mengubah inisialisasi Shape yang ada pada method InitializeShape() dengan memanfaatkan class Komposisi
01
///
02
/// Author: Jeffrey Hermanto Halimsetiawan

03
/// Untuk melakukan inisialisasi shape yang ada
04
///

05
private 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
Output dari program di atas adalah sebagai berikut:

Output Simple Composite
Tentunya, pattern ini akan sangat berguna sekali dalam menyelesaikan permasalahan yang hierarkial.

Leave a Reply

Subscribe to Posts | Subscribe to Comments

- Copyright © Ilmu Stikom Banyuwangi -Ilmu Stikom Banyuwangi -dherry- Powered by Blogger