- Kita tidak bisa mengubah ciri bawaan dari suatu object class sewaktu runtime. Contohnya sebuah class DesimalKorektor. Kita tidak akan bisa mengubah sebuah DesimalKorektor menjadi DesimalKorektorDuaDigit sewaktu runtime bila kita memakai konsep inherintace secara klasik.
- Semakin kita banyak menggunakan permutasi, akan semakin susah memakai beberapa class di package kita. Lebih jelasnya begini ; jika anda ingin meng-extend-kan sebuah class DesimalKorektor supaya lebih scalable, anda mungkin akan membuat subclass ScalableDesimalKorektor dari DesimalKorektor. Untuk membuat DesimalKorektor yang bisa di-undo, anda mungkin akan membuat subclass UndoableDesimalKorektor. Tetapi, bagaimana caranya bila kita ingin mengkombinasikan fitur-fitur dari beberapa subclass tadi menjadi satu subclass (sewaktu runtime)? Dengan inheritance anda harus mendeklarasikan subclass tadi untuk menambahkan fitur baru. Setiap fitur baru akan meningkatkan jumlah class yang diperlukan, sehingga akan diperlukan usaha lebih dalam management-nya.
Pada beberapa “aliran” developer, ada yang melakukan beberapa metode untuk menanggulangi kelemahan dari inheritance ini. Diantaranya dengan menggunakan “Decorator Pattern”. Untuk menambahkan fitur baru pada suatu subclass, Decorator Pattern lebih menerapkan konsep komposisi dibandingkan pewarisan dari inheritance. Sehingga akan menjadi mungkin untuk menambahkan ciri baru dan mengubah perilaku (behavior) dari class tersebut sewaktu runtime.
Prinsip utama dari Decorator Pattern adalah setiap object decorator dengan type tertentu dapat menambahkan atau merubah behavior dari object yang di “decor”. Sang class Decorator dan class yang di “décor” harus meng-implement interface yang sama.
Decorator Pattern terdiri dari :
- Decorator / decorated (interface)
- Concrete decorated (class)
- Absctract decorator (class)
- Concrete decorator (class-class)
Di posting berikutnya akan kita bahas masing-masing elemen diatas.