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:
Output dari program di atas adalah sebagai berikut:
Tentunya, pattern ini akan sangat berguna sekali dalam menyelesaikan permasalahan yang hierarkial.
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:
- Buat sebuah class Komposisi yang merupakan group dari shape yang ada
- 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.
- Implementasikan method Draw(Graphics g, Point origin) pada Kotak
- Implementasikan method Draw(Graphics g, Point origin) pada Lingkaran
- Implementasikan method Draw(Graphics g, Point origin) pada Garis
- Mengubah inisialisasi Shape yang ada pada method InitializeShape() dengan memanfaatkan class Komposisi
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 | ///
|
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 | } |
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 | } |
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 | } |
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 | } |
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 | } |
Output dari program di atas adalah sebagai berikut:
Tentunya, pattern ini akan sangat berguna sekali dalam menyelesaikan permasalahan yang hierarkial.
0 komentar:
Speak up your mind
Tell us what you're thinking... !