Skip to content
27 September 2010 / Jeffrey Hermanto Halimsetiawan

[Pola dan Arsitektur Perangkat Lunak] Composite Pattern


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
  2. /// <summary>
    /// Author: Jeffrey Hermanto Halimsetiawan
    /// </summary>
    public class Komposisi : Shape
    {
        private Point _origin;
    
        private List<Shape> _gambar;
    
        public Point Origin
        {
            get
            {
                return _origin;
            }
            set
            {
                _origin = value;
            }
        }
    
        public Komposisi()
        {
            _gambar = new List<Shape>();
        }
    
        public void Add(Shape s)
        {
            _gambar.Add(s);
        }
    
        public void Remove(Shape s)
        {
            _gambar.Remove(s);
        }
    
        public override void Draw(System.Drawing.Graphics g)
        {
            foreach (Shape s in _gambar)
            {
                s.Draw(g, _origin);
            }
        }
    
        public override void Draw(System.Drawing.Graphics g, Point origin)
        {
            Point newOrigin = new Point(origin.X + _origin.X,
                                        origin.Y + _origin.Y);
            foreach (Shape s in _gambar)
            {
                s.Draw(g, newOrigin);
            }
        }
    }
    
  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. /// <summary>
    /// Author: Jeffrey Hermanto Halimsetiawan
    /// </summary>
    public abstract class Shape
    {
        public abstract void Draw(Graphics g);
        public abstract void Draw(Graphics g, Point origin);
    }
    
  5. Implementasikan method Draw(Graphics g, Point origin) pada Kotak
  6. /// <summary>
    /// Author: Jeffrey Hermanto Halimsetiawan
    /// </summary>
    public class Kotak : Shape
    {
        private Point _kiriAtas;
        private Point _kananBawah;
    
        public Point KananBawah
        {
            get
            {
                return _kananBawah;
            }
            set
            {
                _kananBawah = value;
            }
        }
    
        public Point KiriAtas
        {
            get
            {
                return _kiriAtas;
            }
            set
            {
                _kiriAtas = value;
            }
        }
    
        public override void Draw(System.Drawing.Graphics g)
        {
            Draw(g, new Point(0, 0));
        }
    
        public override void Draw(System.Drawing.Graphics g, Point origin)
        {
            Pen pen = new Pen(new SolidBrush(Color.Brown));
    
            Point t1 = new Point(origin.X + _kiriAtas.X,
                                 origin.Y + _kiriAtas.Y);
            Point t2 = new Point(origin.X + _kananBawah.X,
                                 origin.Y + _kananBawah.Y);
    
            g.DrawRectangle(pen, t1.X,
                                 t1.Y,
                                 t2.X - t1.X,
                                 t2.Y - t1.Y);
        }
    }
    
  7. Implementasikan method Draw(Graphics g, Point origin) pada Lingkaran
  8. /// <summary>
    /// Author: Jeffrey Hermanto Halimsetiawan
    /// </summary>
    public class Lingkaran : Shape
    {
        private Point _pusat;
        private int _radius;
    
        public Point Pusat
        {
            get
            {
                return _pusat;
            }
            set
            {
                _pusat = value;
            }
        }
    
        public int Radius
        {
            get
            {
                return _radius;
            }
            set
            {
                _radius = value;
            }
        }
    
        public override void Draw(System.Drawing.Graphics g)
        {
            Draw(g, new Point(0, 0));
        }
    
        public override void Draw(System.Drawing.Graphics g, Point origin)
        {
            Pen pen = new Pen(new SolidBrush(Color.DarkGreen));
    
            Point tp = new Point(origin.X + _pusat.X,
                                 origin.Y + _pusat.Y);
    
            g.DrawEllipse(pen, tp.X - _radius,
                               tp.Y - _radius,
                               _radius * 2,
                               _radius * 2);
        }
    }
    
  9. Implementasikan method Draw(Graphics g, Point origin) pada Garis
  10. /// <summary>
    /// Author: Jeffrey Hermanto Halimsetiawan
    /// </summary>
    public class Garis : Shape
    {
        private Point _titik1;
        private Point _titik2;
    
        public Point Titik1
        {
            get
            {
                return _titik1;
            }
            set
            {
                _titik1 = value;
            }
        }
    
        public Point Titik2
        {
            get
            {
                return _titik2;
            }
            set
            {
                _titik2 = value;
            }
        }
    
        public override void Draw(System.Drawing.Graphics g)
        {
            Draw(g, new Point(0, 0));
        }
    
        public override void Draw(System.Drawing.Graphics g, Point origin)
        {
            Pen pen = new Pen(new SolidBrush(Color.Magenta));
    
            Point t1 = new Point(origin.X + _titik1.X,
                                 origin.Y + _titik1.Y);
            Point t2 = new Point(origin.X + _titik2.X,
                                 origin.Y + _titik2.Y);
    
            g.DrawLine(pen, t1, t2);
        }
    }
    
  11. Mengubah inisialisasi Shape yang ada pada method InitializeShape() dengan memanfaatkan class Komposisi
  12. /// <summary>
    /// Author: Jeffrey Hermanto Halimsetiawan
    /// Untuk melakukan inisialisasi shape yang ada
    /// </summary>
    private void InitializeShape()
    {
        Komposisi kp = new Komposisi();
        kp.Origin = new Point(500, 100);
    
        Kotak k = new Kotak();
        k.KiriAtas = new Point(10, 10);
        k.KananBawah = new Point(110, 110);
        kp.Add(k);
    
        Lingkaran l = new Lingkaran();
        l.Pusat = new Point(60, 60);
        l.Radius = 30;
        kp.Add(l);
    
        Garis g = new Garis();
        g.Titik1 = new Point(81, 39);
        g.Titik2 = new Point(39, 81);
        kp.Add(g);
    
        Komposisi kp2 = new Komposisi();
        kp2.Origin = new Point(10, 200);
        kp2.Add(k);
        kp2.Add(l);
        kp2.Add(g);
    
        _gambar.Add(kp);
        _gambar.Add(kp2);
    
    }
    

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.

  1. rahma / Nov 12 2010 18:38

    saya mau nanya dong, contoh baut pattern yang composite gimana? saya lagi belajar pattern tapi bingung sama contoh2nya..

    terimakasih🙂

    • Jeffrey Hermanto / Nov 13 2010 22:36

      ya yang saya tulis di postingan ini kan merupakan contoh Composite Pattern😀

  2. Rofianto / Mar 16 2011 00:12

    ok mas brow.. tak pelajari dulu lah..

    • Jeffrey Hermanto / Mar 17 2011 10:12

      silahkan..
      semoga bermanfaat😀

  3. Hendrik Tekayadi / Sep 27 2011 15:33

    Waa.. kebetulan bgt semester ini ngambila Pola dan Arsitektur PL
    sangat menolong ~

    thanks, mas Jeff

    xD

    • Jeffrey Hermanto Halimsetiawan / Sep 27 2011 16:24

      sama2..

      sebetulnya masi banyak pattern yang belum ditulis, cman gk sempet waktunya🙂

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: