Pendahuluan

Untuk melihat apa itu Design Pattern, bisa dilihat di sini

Untuk melihat Design Pattern yang diajukan oleh Gang Of Four, bisa dilihat di sini

Untuk melihat Pendahulan Design Pattern - Decorator - Part 1


Apa itu Decorator Pattern ?

Dari tutorial point :

The decorator pattern is a design pattern that allow to add new functionality to an existing object without altering its structure

Terjemahan bebas :

Decorator Pattern adalah Design Pattern yang memungkinkan untuk menambahkan fungsi secara dinamis ke sebuah objek tertentu, tanpa mengubah struktur dari object tersebut.

Jadi di dalam menambahkan fungsi atau behaviour secara dinamik kita bisa memakai pendekatan :


1. Menambahkan behaviour/fungsi di struktur codenya langsung sehingga bisa divalidasi di waktu compile time

Lebih jelasnya baca di Decorator - Part 1


2. Menambahkan behaviour/fungsi di struktur codenya dengan pendekatan decorator.

Seperti penjelasan di halaman sebelumnya, dengan pendekatan pertama diatas kita melihat ada prinsip OOP yaitu SOLID yang kita langgar, yaitu :

  • Single Object Responsibility
  • Open Close Principle
  • Liskov Substitution Principle

Intinya, dengan pendekatan pertama diatas, kita menambahkan attribute di tiap class-class terkait untuk merepresentasikan pernak-pernik behaviour/fungsi yang mau kita tambahkan.

Tetapi dengan adanya penambahan seperti ini, membuat class-class tersebut menjadi melanggar prinsip Open Close Principle, Single Object Responsibiliy, dan juga Liskov Substitution.

Nah sekarang gimana dong caranya ?

Yaa pakai Decorator.., yaitu dengan menambahkan fungsi atau behaviour bukan dengan cara inheritance/subclassing, akan tetapi dengan cara Aggregasi atau Komposisi.

Aggregasi atau Komposisi ini artinya kita membuat class baru dan antara class awal dengan class baru tersebut mempunyai hubungan referensi saja, dan bukan sebagai subclass.

Hubungan referensi ini kemudian bisa dibungkus dalam sebuah antarmuka yang seragam (interface) dan dapat secara mudah ditambahkan atau diganti-ganti secara dinamik sesuai dengan jenis dan kebutuhan apa yang mau didekorasi.

Bingung kaaan..


Aggregasi atau Komposisi

Inti dari Design Pattern Decorator ini adalah Aggregasi atau Komposisi, yaitu menggabungkan antara banyak barang/item secara bertumpuk-tumpuk untuk mencapai hasil yang diinginkan.

Cara menggabungkan ini di Decorator Pattern adalah dengan cara menghubungkan antara satu object dengan object lain dengan keterikatan yang longgar.

Cieee..cieee.. terikat tapi kok longgar-longgar aja..

Cukupp..cukup..

Kembali ke Aggregasi tadi, yang menghubungkan antara satu object dengan object lain dengan keterikatan yang longgar.

Keterikatan yang longgar, artinya kita tidak memakai inheritance/subclassing, akan tetapi cukup menggunakan interface saja.

Dan interfacenya hanya ada 1 saja, agar bisa mempunyai class implementation yang banyak tergantung behaviour/fungsi yang diinginkan, dan mudah ditukar-tukar, diganti, dan dimodifikasi nantinya.

Teknisnya bagaimana ?


Jadi akan ada 1 interface :

  • InterfaceA , misalnya sebagai interface umum untuk Decorator ini.

Dan akan ada 2 class :

  • Class/Objek aslinya yang juga implements InterfaceA.
  • Wrapper/BaseDecorator class yang juga implements InterfaceA, dan didalamnya ada satu attribute wrappe bertipe InterfaceA juga.

Dan akan ada x class yang merupakan Implementasi Wrapper/Decorator yang extend BaseDecorator sebanyak behaviour/fungsi yang diinginkan.


Dengan membuat struktur solusi seperti diatas, maka hubungan antara Class/Objek aslinya dengan Decorator bisa dijamin bersifat longgar.

Dan semua class diatas, baik class asli, BaseDecorator/Wrapper, dan implementasi BaseDecorator/Wrapper hanya saling terikat dengan InterfaceA yang sama.

Penambahan sebuah “Pernak-pernik” dekorasi dapat dilakukan melalui class Implementasi BaseDecorator/Wrapper diatas.

Dengan adanya attribute bertipe InterfaceA yang sama di semua class, dan class Implementasi BaseDecorator/Wrapper yang mempunyai link attribute ke tipe InterfaceA yang sama juga, maka kita bisa membuat tumpukan Decorator yang saling melengkapi dan mudah diganti-ganti.

Secara umum, mirip denga pemanggilan fungsi di dalam fungsi.

fungsiA(fungsiB(fungsiC(object)))

Bedanya adalah di Decorator Pattern ini, kita mempunyai interfaceA yang sama baik Object dan Decoratornya, dan bisa menambahkan fungsi spesifik terhadap Decoratornya sebelum atau sesudah memanggil method mandatory dari InterfaceA yang ada di dalam class Decorator ini.


Sebenarnya apa yang dilakukan oleh class Implementasi Wrapper/Decorator ini ?

Yang dilakukan adalah :

  • berperilaku yang sama dengan Object aslinya, sehingga mengimplementasikan method yang sama yang diminta dari InterfaceA diatas.
  • memanggil method yang sama dari attribute wrappe yang ada di dalam class Decorator tersebut, agar efek dari fungsi-fungsi yang bertumpuk dari Decorator Pattern ini bisa berjalan.
  • bisa menambahkan fungsi khusus untuk spesifik Decoratornya di method tadi, sebelum atau sesudah memanggil method di attribute Wrappee nya.

Kita lanjut di Part 3