Design Pattern : Decorator

Posted on Updated on

Character Decorator Pattern

Masih dengan topik tentang Design Pattern. Kali ini saya akan membagi wawasan tentang Decorator Pattern. Artikel ini merupakan artikel ke-3 setelah artikel pertama dan kedua membahas tentang Strategy Pattern dan Observer Pattern. Jika kedua pattern awal merupakan jenis Behavioral Pattern, Decorator Pattern termasuk dalam jenis Structural Pattern.  Decorator Pattern digunakan dalam kondisi di mana sebuah objek memiliki responsibility yang didapatkan dari objek yang lain. Responsibility ini menyebabkan adanya nilai tambah pada objek yang ditempeli tersebut. Salah satu contoh dari responsibility ini adalah penghias boneka, dekorasi ruangan, senjata pada mainan action figure, di mana objek utamanya adalah boneka, ruangan, atau action figure itu sendiri. Ada contoh menarik dari buku Erich Gamma yang mengangkat tentang penggunaan atribut / properti pada objek TextView yang memiliki atribut border dan scroll. Kira-kira ilustrasinya sebagai berikut.

Ilustrasi Konsep Decorator Pada  TextView
Ilustrasi Konsep Decorator Pada TextView

Pada ilustrasi di atas, objek TextView pada awalnya tidak memiliki atribut apapun. Kosong, tanpa tambahan. Kemudian user menginginkan adanya penambahan fitur pada TextView berupa responsibilitas berupa scroll yang digunakan apabila text melebihi tinggi dari TextView yang sudah ditetapkan sebelumnya. Selain itu, user juga menginginkan untuk menambah border pada TextView agar terlihat lebih menarik. Nah, pada konsep Decorator Pattern ini, fitur tambahan Scroll dan Border juga diposisikan sebagai objek, sehingga fleksibel untuk ditambahkan pada berbagai objek. Memang bisa kita inisiasikan sendiri atribut-atribut tersebut pada objek TextView, tapi ini akan menyulitkan pengembangan ke depan apabila akan ditambah dengan tambahan fitur objek yang lain, di mana setiap ada penambahan objek berarti harus menambahkan 1 atribut baru di objek TextView. Dengan Decorator Pattern inilah, langkah penambahan fitur dibuat lebih fleksibel dan elegant dengan tidak harus menginisiasikan setiap objek baru ke dalam objek TextView.

Decorator Pattern digunakan dalam kondisi-kondisi sebagai berikut :

  • To add responsibilities to individual objects dynamically and transparently, that is, without affecting other objects.
  • For responsibilities that can be withdrawn.
  • When extension by subclassing is impractical. Sometimes a large number of independent extensions are possible and would produce an explosion of subclasses to support every combination. Or a class definition may be hidden or otherwise unavailable for subclassing.

Untuk mengaplikasikan Decorator Pattern, beginilah struktur class diagram yang digunakan.

Decorator Pattern Class Diagram
Decorator Pattern Class Diagram

Dari ilustrasi, dapat dilihat bahwa ada bagian-bagian yang memiliki peran masing-masing, yaitu :

Component

Bagian ini merupakan interface dari objek-objek yang memiliki responsibilitas untuk ditambahkan ke ConcreteComponent.

ConcreteComponent

Bagian ini mendefinisikan sebuah objek yang memiliki kemampuan untuk menempelkan fitur tambahan dari objek lain ke dalam dirinya.

Decorator

Sebuah objek reference abstrak dari objek-objek yang merepresentasikan sebagai fitur-fitur tambahan yang nantinya akan ditempelkan pada ConcreteComponent.

ConcreteDecorator

Bagian yang merepresentasikan objek tambahan yang dapat ditempelkan pada ConcreteComponent.

Dengan Decorator Pattern, didapatkak keuntungan-keuntungan sebagai berikut :

  1. More flexibility then static inheritance. Decorator Pattern fleksibel dalam menambahan responsibilitas pada objek dibandingkan dengan memiliki banyak inheritance di dalam objek ConcreteComponent. Dengan decorator, responsibilitas dapat ditambahkan maupun dikurangi dengan cara yang sederhana (dengan attach dan detach). Jika dengan cara biasa, kita harus membuat multiple inheritance pada objek secara manual.
  2. Avoids feature-laden classes high up in the hierarchy. Decorator Pattern menawarkan cara yang adil dalam memberikan responsibilitas. Pada kasus yang lebih kompleks, kita dapat dengan mudah menambahkan responsibilitas tanpa harus meng-inheritance objek fitur sebelum ditambahkan. Konsep Decorator Pattern dapat dianalogikan kita membeli apa yang kita gunakan. Dengan konsep ini, objek ConcreteDecorator dapat berdiri tanpa harus dependent ke objek ConcreteComponent.
  3. A decorator and its component aren’t identical. Objek Decorator bertindak layaknya objek transparant, di mana saat ditambahkan, ConcreteComponent tidak perlu menginisiasi objek ConcreteDecorator secara jelas. Ini akan meningkatkan fleksibilitas dalam penulisan inheritance objek.
  4. Lots of little objects. Dengan konsep Decorator Pattern, memungkinkan akan menghasilkan banyak objek spesifik. Masing-masing fitur direpresentasikan pada objek ConcreteDecorator yang berbeda-beda. Ini memberikan keleluasaan untuk memodifikasi fitur yang ada di dalamnya. Untuk itu, dibutuhkan dokumentasi teknis agar kita dapat memahami peran masing-masing objek.

Nah, untuk memberikan penjelasan agar teman-teman lebih mudah dalam memahami konsep Decorator Pattern, saya akan menggambarkan kasus dengan program sederhana. Berikut ilustrasinya.

Pada sebuah game, ada 2 karakter yaitu Knight dan Warrior. Dalam kondisi tanpa senjata, 2 karakter ini memiliki daya serang dan bertahan yang berbeda-beda. Untuk memenangkan pertempuran, mereka dapat dilengkapi dengan berbagai jenis senjata yang mana akan menambah daya serang dan bertahan pada karakter. Senjata yang dapat digunakan antara lain pedang (sword), tameng (shield), tombak (spear), dan panah (arrow). Selain itu juga disediakan kuda (horse) untuk menambah kecepatan karakter dalam bertempur.

Senjata-senjata ini dapat dikombinasikan 1 sama lain. Jika dibuat himpunan kombinasi, maka dapat diilistrasikan sebagai berikut :

Knight {sword},
Warrior {spear, shield},
Knight {arrow, horse},
Knight {sword, shield, horse},
dsb . .

Jika tanpa menggunakan design pattern, untuk mengkombinasikan senjata-senjata yang ada, kita harus melakukan inheritance secara manual pada objek. Jika dengan Decorator Pattern, class diagramnya adalah sebagai berikut :

Example Class Decorator Pattern
Example Class Decorator Pattern

File project penerapan Decorator Pattern dapat di download di https://copy.com/wiSqvsisYAT6. Semoga bermanfaat 🙂

Iklan

One thought on “Design Pattern : Decorator

    Design Pattern : Composite « Rekaman Jejak-Jejak said:
    13 Oktober 2013 pukul 12:30

    […] Design Pattern yang termasuk dalam Structural Pattern. Postingan sebelumnya telah membahas tentang Decorator Pattern. Composite Pattern digunakan untuk merepresentasikan sebuah hirarki objek sehingga dapat sebuah […]

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