konsep
Pola dekorator secara dinamis melampirkan tanggung jawab pada objek. Untuk memperluas fungsionalitas, dekorator memberikan alternatif yang lebih fleksibel daripada warisan.
Dekorator dan objek yang dihiasi memiliki supertype yang sama.
Anda dapat membungkus objek dengan satu atau lebih dekorator.
Karena dekorator dan objek yang dihiasi memiliki supertype yang sama, dalam setiap kesempatan di mana objek asli (tertulis) diperlukan, objek yang dihiasi dapat diganti olehnya.
Dekorator dapat menambahkan perilakunya sendiri sebelum dan/atau setelah tindakan dekorator yang ditugaskan untuk mencapai tujuan tertentu.
Objek dapat didekorasi kapan saja, sehingga benda dapat didekorasi secara dinamis dan tidak terbatas dengan dekorator favorit Anda selama runtime.
Di Java, banyak kelas di bawah paket IO adalah perwujudan dari pola dekorator yang khas, seperti:
Kelas dekoratif mengimplementasikan antarmuka yang sama dengan kelas yang dihiasi.
Kelas yang dihiasi tidak peduli kelas implementasi mana yang digunakan untuk menghiasnya.
Metode bisnis yang sama disebut oleh kelas dekoratif untuk meningkatkan fungsi kelas dekoratif.
Contoh:
Diagram kelas
antarmuka publik ireader {void read (); } Public Class Reader mengimplementasikan ireader {@Override public void read () {System.out.println ("Baca pembaca"); }} kelas publik BufferedReader mengimplementasikan ireader {private Ireader mReader; Public BufferedReader (IReader Reader) {this.mreader = pembaca; } @Override public void read () {System.out.println ("Baca BufferedReader"); mReader.read (); }} tes kelas publik {public static void main (string [] args) {reader reader = pembaca baru (); reader.read (); System.out.println ("-----------"); BufferedReader bufferedReader = BufferedReader baru (pembaca); bufferedreader.read (); }} Fitur:
1. Objek dekoratif dan benda nyata memiliki antarmuka yang sama. Dengan cara ini objek klien dapat berinteraksi dengan objek dekoratif dengan cara yang sama seperti objek nyata.
2. Objek dekoratif berisi referensi ke objek nyata
3. Objek dekoratif menerima semua permintaan dari klien. Ini meneruskan permintaan ini ke objek nyata.
4. Mengacak objek dapat menambahkan beberapa fitur tambahan sebelum atau setelah meneruskan permintaan ini. Ini memastikan bahwa saat runtime, fungsi tambahan dapat ditambahkan secara eksternal tanpa memodifikasi struktur objek yang diberikan.
Dalam desain yang berorientasi objek, ekstensi fungsional ke kelas tertentu biasanya dicapai melalui warisan. Setelah dekorasi, objek sebenarnya diadakan untuk meningkatkan fungsinya.
Perbedaan antara mode dekorator dan adaptor:
Tentang tanggung jawab baru: Adaptor juga dapat menambah tanggung jawab baru saat mengonversi, tetapi tujuan utamanya tidak. Model dekorator terutama menambahkan tanggung jawab baru kepada dekorator.
Tentang objek yang dibungkus: Adaptor mengetahui detail adaptor (yaitu, kelas adaptor). Dekorator hanya tahu apa antarmuka.
Adapun jenis spesifiknya (apakah itu kelas dasar atau kelas turunan lainnya) hanya diketahui selama runtime.