Definisi Komposit: Atur objek dalam struktur pohon untuk mencapai hierarki "bagian-total", sehingga klien memiliki penggunaan objek individu dan objek yang secara konsisten.
Komposit lebih mudah dipahami. Objek -objek ini dalam badan komposisi memiliki antarmuka umum. Ini dapat digambarkan sebagai menarik seratus gerakan.
Oleh karena itu, mode komposit menggunakan mode iterator, yang mirip dengan mode rantai tanggung jawab.
Manfaat gabungan:
1. Buat panggilan klien sederhana, dan klien dapat menggunakan struktur kombinasi atau objek tunggal secara konsisten. kode.
2. Lebih mudah untuk menambahkan bagian objek ke dalam badan kombinasi. Klien tidak harus mengubah kode karena telah menambahkan komponen objek baru.
Cara menggunakan komposit
Pertama, tentukan antarmuka atau kelas abstrak. Mengelola Komposisi Komposit.
Kode berikut didefinisikan sebagai kelas abstrak, dan umumnya mencoba menggunakan antarmuka sebanyak mungkin.
Salinan kode adalah sebagai berikut:
Peralatan kelas abstrak publik {
nama string pribadi;
// Harga Internet
netprice ganda abstrak publik ();
// Harga diskon
Publik Abstrak Ganda Diskon ();
// Tambahkan metode bagian
Tambah Boolean Publik (Peralatan Peralatan) {Return False;}
// Hapus metode bagian
Boolean Publik Lepaskan (peralatan peralatan) {return false;}
// Catatan di sini, berikut adalah metode untuk mengakses kelas komponen.
Iterator publik () {return null;}
peralatan publik (nama string akhir) {this.name = nama;
}
Peralatan kelas abstrak adalah definisi komponen, mewakili objek kelas komposit, dan beberapa metode umum didefinisikan dalam peralatan.
Salinan kode adalah sebagai berikut:
Disk kelas publik memperluas peralatan {
disk publik (nama string) {super (name);
// Tentukan harga jaringan disk ke 1
netprice ganda publik () {return 1.;
// Tentukan harga diskon disk adalah diskon 0,5%.
Public Double DiskonPrice () {return .5;
}
Disk adalah objek, atau komponen, di badan kombinasi, yang merupakan elemen tunggal (primitif).
Kemungkinan lain adalah bahwa komponen juga merupakan kombinasi, yaitu, ada 'putra' di bawah komponen ini. Sekarang kita perlu mendefinisikan kombinasi ini:
Salinan kode adalah sebagai berikut:
Kelas Abstrak Compositeequipment memperluas peralatan {
private int i = 0;
// Tentukan vektor untuk menyimpan 'putra'
Peralatan LSIT pribadi = ArrayList baru ();
public compositeequipment (nama string) {super (name);
Tambah boolean publik (peralatan peralatan) {
this.equipment.add (peralatan);
Kembali Benar;
}
netprice ganda publik () {
netprice ganda = 0.;
Iterator iter = Equipment.iterator ();
untuk (iter.hasnext ())
netprice+= ((peralatan) iter.next ()). netprice ();
mengembalikan netprice;
}
Public Double DiskonPrice () {
Double DiskonPrice = 0.;
Iterator iter = Equipment.iterator ();
untuk (iter.hasnext ())
DiskonPrice+= ((peralatan) iter.next ()). DiskonPrice ();
Return DiskonPrice;
}
// Catatan di sini, berikut adalah metode untuk mengakses komponen dalam kombinasi Anda sendiri.
// Alasan mengapa disk di atas tidak ada adalah karena disk adalah satu elemen.
Iterator publik iter () {
return equipment.iterator ();
}
// kelebihan metode iterator
public boolean hasnext () {return i <equipment.size ();
// kelebihan metode iterator
objek publik selanjutnya () {
if (hasnext ())
return equipment.elementat (i ++);
kalau tidak
Lempar NosuchelementException baru ();
}
}
Compositeequipment di atas mewarisi peralatan, dan menyediakan metode akses eksternal untuk objek di dalamnya, overloading iterator.
Mari kita lihat dua kategori spesifik dari compositeequipment: sasis kotak disk dan kabinet kotak. kotak, seperti drive floppy hard disk, dll. Tidak diragukan lagi, keduanya kombinasi.
Salinan kode adalah sebagai berikut:
sasis kelas publik memperluas compositeequipment {
sasis publik (nama string) {super (nama);
netprice ganda publik () {return 1.+super.netprice ();
Public Double DiskonPrice () {return .5+super.discountprice ();
}
Kabinet kelas publik memperluas compositeequipment {
kabinet publik (nama string) {super (nama);
netprice ganda publik () {return 1.+super.netprice ();
Public Double DiskonPrice () {return .5+super.discountprice ();
}
Sejauh ini kami telah menyelesaikan arsitektur seluruh model komposit.
Kita dapat melihat kode klien yang memanggil Compose:
Salinan kode adalah sebagai berikut:
Kabinet kabinet = kabinet baru ("menara");
Sasis sasis = sasis baru ("sasis pc");
// Masukkan sasis PC ke dalam menara (kemas disk ke dalam kotak)
kabinet.add (sasis);
// Masukkan hard drive 10GB ke sasis PC (pasang hard drive ke dalam kotak disk)
chassis.add (disk baru ("10 GB"));
// Memanggil metode NetPrice ();
System.out.println ("NetPrice ="+Cabinet.NetPrice ());
System.out.println ("DiskonPrice ="+Cabinet.DiscountPrice ());
Metode yang disebut di atas adalah netprice () atau diskon (). Faktanya, komposit menggunakan iterator untuk melintasi seluruh struktur pohon, menemukan objek yang juga berisi metode ini dan mengimplementasikan eksekusi panggilan.
Komposit adalah model yang sangat pintar yang mewujudkan kebijaksanaan.
Mengambil forum sebagai contoh, ada banyak posting (pesan) dalam versi (forum). , jadi kita masuk Jive, lihat bagaimana itu diimplementasikan.
Jive Anatomy
Di Jive, ForumThread adalah wadah kontainer (kombinasi) forumessages. Artinya, ForumThread mirip dengan Compositeequipment dalam contoh kami sebelumnya.
Salinan kode adalah sebagai berikut:
[benang]
|- [Pesan]
|- [Pesan]
|- [Pesan]
|- [Pesan]
|- [Pesan]
Kami melihat kode berikut di ForumTread:
Salinan kode adalah sebagai berikut:
antarmuka publik forumThread {
...
public void addmessage (forumessage parentMessage, forumessage newmessage)
melempar Exhorized Exception;
public void deletemessage (pesan forumessage)
melempar Exhorized Exception;
Pesan Iterator Publik ();
...
}
Mirip dengan compositeequipment, ia menyediakan metode untuk mengakses komponen di badan kombinasi Anda sendiri: menambahkan, menghapus, dan melintasi.
Berdasarkan analisis saya tentang jive dalam model lain, kami pada dasarnya memahami kerangka kerja sistem forum jive. .