J melihat pola desain Komposit

Suatu hari saya sedang mendengarkan Car Talk Radio Publik Nasional , siaran mingguan populer di mana penelepon mengajukan pertanyaan tentang kendaraan mereka. Sebelum setiap jeda program, pembawa acara meminta penelepon untuk menghubungi 1-800-CAR-TALK, yang sesuai dengan 1-800-227-8255. Tentu saja, yang pertama terbukti lebih mudah diingat daripada yang terakhir, sebagian karena kata "CAR TALK" adalah gabungan: dua kata yang mewakili tujuh digit. Manusia umumnya merasa lebih mudah menangani komposit, daripada komponen individualnya. Demikian pula, saat Anda mengembangkan perangkat lunak berorientasi objek, seringkali mudah untuk memanipulasi komposit seperti Anda memanipulasi komponen individual. Premis tersebut merupakan prinsip dasar dari pola desain Komposit,topik Pola Desain Java ini cicilan.

Pola Komposit

Sebelum kita menyelami pola Komposit, pertama-tama saya harus mendefinisikan objek komposit: objek yang berisi objek lain; misalnya, sebuah gambar dapat terdiri dari grafik primitif, seperti garis, lingkaran, persegi panjang, teks, dan sebagainya.

Pengembang Java memerlukan pola Komposit karena kita sering kali harus memanipulasi komposit persis sama dengan cara kita memanipulasi objek primitif. Misalnya, grafik primitif seperti garis atau teks harus digambar, dipindahkan, dan diubah ukurannya. Tapi kami juga ingin melakukan operasi yang sama pada komposit, seperti gambar, yang terdiri dari primitif tersebut. Idealnya, kami ingin melakukan operasi pada objek primitif dan komposit dengan cara yang persis sama, tanpa membedakan keduanya. Jika kita harus membedakan antara objek primitif dan komposit untuk melakukan operasi yang sama pada dua jenis objek tersebut, kode kita akan menjadi lebih kompleks dan lebih sulit untuk diterapkan, dipelihara, dan diperluas.

Pada Design Patterns , penulis mendeskripsikan pola Composite seperti ini:

Susun objek ke dalam struktur pohon untuk merepresentasikan hierarki bagian-keseluruhan. Komposit memungkinkan klien memperlakukan objek individu dan komposisi objek secara seragam.

Menerapkan pola Komposit itu mudah. Kelas komposit memperluas kelas dasar yang mewakili objek primitif. Gambar 1 menunjukkan diagram kelas yang menggambarkan struktur pola Komposit.

Dalam diagram kelas Gambar 1, saya menggunakan nama kelas dari diskusi pola Komposit Pola Desain : Componentmewakili kelas dasar (atau mungkin antarmuka) untuk objek primitif, dan Compositemewakili kelas komposit. Misalnya, Componentkelas mungkin mewakili kelas dasar untuk grafis primitif, sedangkan Compositekelas mungkin mewakili Drawingkelas. LeafKelas Gambar 1 merepresentasikan objek primitif konkret; misalnya, Linekelas atau Textkelas. Metode Operation1()dan Operation2()mewakili metode khusus domain yang diterapkan oleh kelas Componentdan Composite.

The Compositekelas mempertahankan koleksi komponen. Biasanya, Compositemetode diimplementasikan dengan melakukan iterasi atas koleksi tersebut dan menjalankan metode yang sesuai untuk masing-masing Componentdalam koleksi. Misalnya, sebuah Drawingkelas mungkin mengimplementasikan draw()metodenya seperti ini:

// Metode ini adalah metode Komposit public void draw () {// Iterasi komponen untuk (int i = 0; i <getComponentCount (); ++ i) {// Dapatkan referensi ke komponen dan panggil draw-nya metode Komponen komponen = getComponent (i); component.draw (); }}

Untuk setiap metode yang diimplementasikan di Componentkelas, Compositekelas mengimplementasikan metode dengan tanda tangan yang sama yang diiterasi di atas komponen komposit, seperti yang diilustrasikan oleh draw()metode yang tercantum di atas.

The Compositekelas memperluas Componentkelas, sehingga Anda dapat melewati komposit untuk metode yang mengharapkan komponen; misalnya, pertimbangkan metode berikut:

// Metode ini diimplementasikan dalam kelas yang tidak terkait dengan // Kelas Komponen dan Komposit public void repaint (Komponen komponen) {// Komponen dapat berupa komposit, tetapi karena ia memperluas // kelas Komponen, metode ini tidak perlu // bedakan antara komponen dan komposit component.draw (); }

Metode sebelumnya melewati sebuah komponen — baik komponen sederhana atau komposit — lalu memanggil draw()metode komponen itu . Karena Compositekelas diperluas Component, repaint()metode tidak perlu membedakan antara komponen dan komposit — metode ini hanya memanggil draw()metode untuk komponen (atau komposit).

Diagram kelas pola komposit Gambar 1 menggambarkan satu masalah dengan pola tersebut: Anda harus membedakan antara komponen dan komposit saat Anda mereferensikan a Component, dan Anda harus menjalankan metode khusus komposit, seperti addComponent(). Anda biasanya memenuhi persyaratan tersebut dengan menambahkan metode, seperti isComposite(), ke Componentkelas. Metode itu mengembalikan falsekomponen dan diganti di Compositekelas untuk dikembalikan true. Selain itu, Anda juga harus mentransmisikan Componentreferensi ke sebuah Compositeinstance, seperti ini:

... if (component.isComposite ()) {Composite composite = (Composite) komponen; komposit.addComponent (someComponentThatCouldBeAComposite); } ...

Perhatikan bahwa addComponent()metode ini meneruskan Componentreferensi, yang bisa berupa komponen primitif atau komposit. Karena komponen tersebut dapat berupa komposit, Anda dapat menyusun komponen ke dalam struktur pohon, seperti yang ditunjukkan oleh kutipan dari Pola Desain yang disebutkan sebelumnya .

Gambar 2 menunjukkan implementasi pola Komposit alternatif.

Jika Anda menerapkan pola Komposit Gambar 2, Anda tidak perlu membedakan antara komponen dan komposit, dan Anda tidak perlu mentransmisikan Componentreferensi ke sebuah Compositeinstance. Jadi fragmen kode yang tercantum di atas berkurang menjadi satu baris:

... component.addComponent (someComponentThatCouldBeAComposite); ...

Namun, jika Componentreferensi dalam fragmen kode sebelumnya tidak merujuk ke a Composite, apa yang harus addComponent()dilakukan? Itu adalah poin utama pertikaian dengan implementasi pola Komposit Gambar 2. Karena komponen primitif tidak berisi komponen lain, menambahkan komponen ke komponen lain tidak masuk akal, sehingga Component.addComponent()metode bisa gagal secara diam-diam atau memunculkan pengecualian. Biasanya, menambahkan komponen ke komponen primitif lain dianggap sebagai kesalahan, jadi melempar pengecualian mungkin merupakan tindakan terbaik.

Jadi, implementasi pola Komposit mana — yang ada di Gambar 1 atau di Gambar 2 — yang paling berhasil? Itu selalu menjadi topik perdebatan hebat di antara pelaksana pola Komposit; Design Patterns lebih memilih implementasi Gambar 2 karena Anda tidak perlu membedakan antara komponen dan container, dan Anda tidak perlu melakukan cast. Secara pribadi, saya lebih suka implementasi Gambar 1, karena saya memiliki keengganan yang kuat untuk menerapkan metode di kelas yang tidak masuk akal untuk tipe objek itu.

Sekarang setelah Anda memahami pola Komposit dan bagaimana Anda dapat mengimplementasikannya, mari kita periksa contoh pola Komposit dengan framework Apache Struts JavaServer Pages (JSP).

Pola Komposit dan Ubin Struts

Kerangka kerja Apache Struts menyertakan pustaka tag JSP, yang dikenal sebagai Ubin, yang memungkinkan Anda membuat Halaman Web dari beberapa JSP. Ubin sebenarnya merupakan implementasi dari pola CompositeView J2EE (Java 2 Platform, Enterprise Edition), yang didasarkan pada pola Komposit Pola Desain . Sebelum kita membahas relevansi pola Komposit dengan pustaka tag Ubin, pertama mari kita tinjau alasan untuk Ubin, dan cara Anda menggunakannya. Jika Anda sudah terbiasa dengan Struts Tiles, Anda dapat membaca sekilas bagian berikut dan mulai membaca di "Gunakan Pola Komposit dengan Struts Tiles."

Catatan: Anda dapat membaca lebih lanjut tentang pola J2EE CompositeView di artikel "Komponen Aplikasi Web yang Dipermudah dengan Tampilan Komposit" ( JavaWorld, Desember 2001) saya.

Desainer sering kali membuat Halaman Web dengan sekumpulan region terpisah; misalnya, Halaman Web Gambar 3 terdiri dari sidebar, header, wilayah konten, dan footer.

Situs web sering kali menyertakan beberapa Halaman Web dengan tata letak yang identik, seperti tata letak sidebar / header / konten / footer Gambar 3. Struts Tiles memungkinkan Anda menggunakan kembali konten dan tata letak di antara beberapa Halaman Web. Sebelum kita membahas penggunaan kembali itu, mari kita lihat bagaimana tata letak Gambar 3 secara tradisional diimplementasikan dengan HTML saja.

Menerapkan tata letak yang kompleks dengan tangan

Contoh 1 menunjukkan bagaimana Anda dapat mengimplementasikan Halaman Web Gambar 3 dengan HTML:

Contoh 1. Tata letak kompleks yang diimplementasikan dengan tangan

    Menerapkan Tata Letak Kompleks dengan Tangan <% - Satu tabel menjabarkan semua konten untuk halaman ini -%>
   
Tautan

Rumah

Produk

Download

Kertas putih

Hubungi kami

Selamat datang di Sabreware, Inc.
Konten khusus halaman ditempatkan di sini

Terima kasih sudah mampir!

JSP sebelumnya memiliki dua kelemahan utama: Pertama, konten halaman disematkan di JSP, jadi Anda tidak dapat menggunakan kembali semua itu, meskipun sidebar, header, dan footer kemungkinan besar sama di banyak Halaman Web. Kedua, tata letak halaman juga disematkan di JSP tersebut, jadi Anda juga tidak dapat menggunakannya kembali meskipun banyak Halaman Web lain di Situs Web yang sama menggunakan tata letak yang sama. Kita dapat menggunakan tindakan tersebut untuk memperbaiki kelemahan pertama, seperti yang akan saya bahas selanjutnya.

Menerapkan tata letak kompleks dengan menyertakan JSP

Contoh 2 menunjukkan implementasi Halaman Web Gambar 3 yang menggunakan :