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:
- Buat sebuah class Komposisi yang merupakan group dari shape yang ada
02 | /// Author: Jeffrey Hermanto Halimsetiawan |
04 | public class Komposisi : Shape |
06 | private Point _origin; |
27 | public void Add(Shape s) |
32 | public void Remove(Shape s) |
37 | public override void Draw(System.Drawing.Graphics g) |
39 | foreach (Shape s in _gambar) |
45 | public override void Draw(System.Drawing.Graphics g, Point origin) |
47 | Point newOrigin = new Point(origin.X + _origin.X, |
48 | origin.Y + _origin.Y); |
49 | foreach (Shape s in _gambar) |
- 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.
2 | /// Author: Jeffrey Hermanto Halimsetiawan |
4 | public abstract class Shape |
6 | public abstract void Draw(Graphics g); |
7 | public abstract void Draw(Graphics g, Point origin); |
- Implementasikan method Draw(Graphics g, Point origin) pada Kotak
02 | /// Author: Jeffrey Hermanto Halimsetiawan |
04 | public class Kotak : Shape |
06 | private Point _kiriAtas; |
07 | private Point _kananBawah; |
09 | public Point KananBawah |
33 | public override void Draw(System.Drawing.Graphics g) |
35 | Draw(g, new Point(0, 0)); |
38 | public override void Draw(System.Drawing.Graphics g, Point origin) |
40 | Pen pen = new Pen( new SolidBrush(Color.Brown)); |
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); |
47 | g.DrawRectangle(pen, t1.X, |
- Implementasikan method Draw(Graphics g, Point origin) pada Lingkaran
02 | /// Author: Jeffrey Hermanto Halimsetiawan |
04 | public class Lingkaran : Shape |
33 | public override void Draw(System.Drawing.Graphics g) |
35 | Draw(g, new Point(0, 0)); |
38 | public override void Draw(System.Drawing.Graphics g, Point origin) |
40 | Pen pen = new Pen( new SolidBrush(Color.DarkGreen)); |
42 | Point tp = new Point(origin.X + _pusat.X, |
45 | g.DrawEllipse(pen, tp.X - _radius, |
- Implementasikan method Draw(Graphics g, Point origin) pada Garis
02 | /// Author: Jeffrey Hermanto Halimsetiawan |
04 | public class Garis : Shape |
06 | private Point _titik1; |
07 | private Point _titik2; |
33 | public override void Draw(System.Drawing.Graphics g) |
35 | Draw(g, new Point(0, 0)); |
38 | public override void Draw(System.Drawing.Graphics g, Point origin) |
40 | Pen pen = new Pen( new SolidBrush(Color.Magenta)); |
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); |
47 | g.DrawLine(pen, t1, t2); |
- Mengubah inisialisasi Shape yang ada pada method InitializeShape() dengan memanfaatkan class Komposisi
02 | /// Author: Jeffrey Hermanto Halimsetiawan |
03 | /// Untuk melakukan inisialisasi shape yang ada |
05 | private void InitializeShape() |
07 | Komposisi kp = new Komposisi(); |
08 | kp.Origin = new Point(500, 100); |
10 | Kotak k = new Kotak(); |
11 | k.KiriAtas = new Point(10, 10); |
12 | k.KananBawah = new Point(110, 110); |
15 | Lingkaran l = new Lingkaran(); |
16 | l.Pusat = new Point(60, 60); |
20 | Garis g = new Garis(); |
21 | g.Titik1 = new Point(81, 39); |
22 | g.Titik2 = new Point(39, 81); |
25 | Komposisi kp2 = new Komposisi(); |
26 | kp2.Origin = new Point(10, 200); |
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.
0 komentar:
Posting Komentar