Definisi: Encapsulate serangkaian interaksi objek dengan objek mediator. Mediator membuat setiap objek berinteraksi tanpa tampilan, dengan demikian melonggarkan kopling dan secara independen mengubah interaksi di antara mereka.
Jenis: Diagram kelas pola kelas perilaku:
Struktur model perantara
Mode perantara juga disebut mode mediator. Dari diagram kelas, dibagi menjadi 3 bagian:
Abstrak Mediator: Tentukan antarmuka antara objek kelas kolega dan objek mediator, dan digunakan untuk komunikasi antara setiap kelas kolega. Secara umum, ini mencakup satu atau beberapa metode acara abstrak dan diimplementasikan oleh subkelas.
Kelas Implementasi Perantara: Diwarisi dari mediator abstrak dan mengimplementasikan metode peristiwa yang didefinisikan dalam mediator abstrak. Menerima pesan dari satu kelas kolega dan kemudian mempengaruhi kelas simultan lainnya melalui pesan.
Kelas Kolega: Jika suatu objek memengaruhi objek lain dan juga dipengaruhi oleh objek lain, maka kedua objek ini disebut kelas kolega. Dalam diagram kelas, hanya ada satu kelas kolega, yang sebenarnya merupakan penghilangan kenyataan. Dalam aplikasi praktis, kelas kolega umumnya terdiri dari banyak, dan mereka mempengaruhi dan bergantung satu sama lain. Semakin banyak kolega, semakin rumit hubungannya. Selain itu, kelas kolega juga dapat direpresentasikan sebagai serangkaian implementasi yang mewarisi kelas abstrak yang sama. Dalam model perantara, pesan tersebut harus ditransmisikan melalui perantara di antara rekan kerja.
Mengapa menggunakan model perantara
Secara umum, hubungan antara kelas kolega relatif kompleks. Ketika beberapa kelas kolega berkorelasi, hubungan mereka akan muncul sebagai struktur mesh yang kompleks. Ini adalah arsitektur yang terlalu banyak dipasangkan, yaitu, tidak kondusif untuk menggunakan kembali kelas dan tidak stabil. Misalnya, pada gambar di bawah ini, ada enam objek seperti kolega. Jika Objek 1 berubah, 4 objek akan terpengaruh. Jika objek 2 berubah, maka 5 objek akan terpengaruh. Dengan kata lain, desain korelasi langsung antara rekannya tidak baik.
Jika model perantara diperkenalkan, hubungan antara kelas kolega akan menjadi struktur bintang. Dari gambar tersebut, kita dapat melihat bahwa perubahan dalam kelas apa pun hanya akan mempengaruhi kelas itu sendiri dan perantara, yang akan mengurangi kopling sistem. Desain yang baik pasti tidak akan merangkum semua logika pemrosesan hubungan objek di kelas ini, tetapi akan menggunakan kelas khusus untuk mengelola perilaku yang bukan milik Anda.
contoh
Berikut ini adalah contoh kode tertentu. Dibandingkan dengan diagram kelas umum, kelas kolega abstrak abstrak abstrak dan mediator abstrak abstrak ditambahkan. Selain itu, ada dua kelas kolega spesifik dan satu mediator spesifik. Ada banyak komentar dalam kode, dan diagram kelas yang sesuai tidak diberikan, yang seharusnya tidak sulit dipahami:
Kolega:
// Kelas Kolega Abstrak Abstrak Abstrak Abstrakcolleague {Mediator AbstractMediator yang Dilindungi; /** Karena ada perantara, maka setiap kolega tertentu harus memiliki kontak dengan perantara,*jika tidak, tidak perlu ada dalam sistem ini. Konstruktor di sini setara dengan mendaftarkan perantara dengan sistem untuk menghubungi*/ public abstractColleague (abstractMediator mediator) {this.mediator = mediator; } // Tambahkan metode untuk menghubungi perantara (mis. Mendaftar) di kelas kolega abstrak public void setMediator (AbstractMediator Mediator) {this.mediator = mediator; }} // Kolega spesifik Koleaguea kelas memperluas AbstractColleAgue {// Setiap kolega tertentu menghubungi mediator melalui kelas induk konstruktor public colleaguea (abstractMediator mediator) {super (mediator); } // Setiap kolega tertentu harus memiliki tugasnya sendiri, dan tidak perlu dikaitkan dengan dunia luar negeri yang membatalkan diri () {System.out.println ("Colleaguea -> Lakukan tugas Anda sendiri ..."); } // Setiap kolega tertentu selalu perlu berinteraksi dengan dunia luar, menangani logika ini dan mengatur pekerjaan melalui mediator public void out () {System.out.println ("Colleaguea-> meminta kolega B untuk melakukan pekerjaan paruh waktu ..."); super.mediator.execute ("rekan", "self"); }} // Kolega spesifik B Class Colleageeb memperluas AbstractColleAgue {public CollegeB (AbstractMediator Mediator) {Super (Mediator); } public void self () {System.out.println ("Rekan B-> Lakukan pekerjaan paruh waktu Anda ..."); } public void out () {System.out.println ("Kolega B-> meminta kolega A untuk melakukan pekerjaan paruh waktu ..."); super.mediator.execute ("colleaguea", "self"); }} Kategori Perantara:
// Abstrak Perantara Abstrak Abstrak AbstractMediator {// Perantara harus mempertahankan informasi kontak dari beberapa rekan yang dilindungi Hashtable <String, AbstractColleGue> rekan = hashtable baru <string, AbstractColleAgue> (); // Perantara dapat secara dinamis membuat kontak dengan kolega public void AddColleAgue (nama string, AbstractColleague c) {this.colleagues.put (name, c); } // perantara juga dapat secara dinamis membatalkan kontak dengan kolega public void deletecolleague (nama string) {this.colleagues.remove (name); } // Perantara harus memiliki operasi untuk menangani logika, menetapkan tugas, dan mempromosikan komunikasi di antara kolega abstrak public abstrak mengeksekusi (nama string, metode string); } // Mediator kelas perantara tertentu memperluas AbstractMediator {// Fungsi paling penting dari perantara adalah berjalan bolak -balik antara rekan kerja public void (nama string, metode string) {if ("self" .Equals (Metode)) {// Setiap orang melakukan tugasnya sendiri jika ("colleageea". (Colleaguea) super.colleagues.get ("colleaguea"); kolega.self (); } else {colleagebeB colleague = (colleageb) super.colleagues.get ("colleAgueB"); kolega.self (); }} else {// kuliah dengan kolega lain if ("colleaguea" .equals (name)) {colleaguea colleague = (colleaguea) super.colleagues.get ("colleaguea"); kolega.out (); } else {colleagebeB colleague = (colleageb) super.colleagues.get ("colleAgueB"); kolega.out (); }}}}} Kelas Tes:
// Kelas Uji Kelas Publik Klien {public static void main (string [] args) {// Buat mediator abstrak abstrak perantara = mediator baru (); // Buat dua rekan koleaguea colleaguea = colleaguea baru (mediator); Rekan kolegaeb = rekan baru (mediator); // Perantara menetapkan kontak dengan masing -masing mediator kolega. Mediator.AddColleague ("Rekan", kolegaeb); // kolega mulai bekerja kolegaa.self (); colleaguea.out (); System.out.println ("================================================================================================================================== ================================================================= ================================================================== ================================================================= ================================================================== ================================================================== ================================================================== Hasil tes:
Kolega A -> Lakukan bagian Anda dalam tugas Anda ... kolega A -> mintalah kolega B untuk melakukan bagian Anda dalam tugas Anda ... kolega b -> lakukan bagian Anda dalam tugas Anda ... ====================================================================================================================================================================== Kolega B -> Lakukan bagian Anda dalam tugas Anda ... kolega B -> Tanyakan kepada kolega A untuk melakukan bagian Anda dalam tugas Anda ... kolega a -> lakukan bagian Anda dalam tugas Anda ... =========================================================================================================================
Meskipun hanya ada dua kelas kolega spesifik dalam kode di atas, dan hanya dua kolega yang dibuat di kelas uji, kami dapat memperluas ini dengan tepat sesuai dengan tujuan model perantara, yaitu, menambahkan kelas kolega tertentu, dan kemudian perantara harus memikul tugas yang lebih berat. Mengapa? Kami melihat bahwa sekarang ada banyak kode penilaian panjang dalam metode Execute () di kelas mediator di atas. Meskipun dapat didekomposisi dan ditambahkan ke metode pribadi lainnya di kelas mediator, logika bisnis tertentu sangat diperlukan.
Oleh karena itu, sementara memisahkan hubungan antara kolega, perantara itu sendiri juga tidak konsisten dengan tugas-tugas yang berlebihan, karena hampir semua logika bisnis dijelaskan kepada perantara, yang dapat digambarkan sebagai peran yang "sangat dinanti". Ini adalah kekurangan dari model perantara.
Selain itu, contoh kode di atas cukup ideal. Kadang -kadang kita tidak dapat mengekstraksi kesamaan antara "kolega" sama sekali untuk membentuk kelas kolega abstrak abstrak, yang sangat meningkatkan kesulitan menggunakan model perantara.
Merevisi:
Karena ada kekurangan dalam implementasi kode di atas dari "asosiasi dua arah yang diekspos dalam aplikasi" yang diusulkan oleh senior Benjielin, menurut metode perbaikan yang diberikan 2, memodifikasi kode di atas sebagai berikut:
Kolega yang dimodifikasi:
// abstrak kelas abstrakcolleague {mediator abstrak abstrak yang dilindungi; // Berhentilah membangun koneksi dengan mediator di konstruktor // public abstractColleague (abstractMediator mediator) {// this.mediator = mediator; //} // Tambahkan metode ke kelas kolega abstrak untuk menghubungi mediator (mis. Pendaftaran) public void setMediator (AbstractMediator Mediator) {this.mediator = mediator; }} // kolega spesifik Koleaguea kelas memperluas AbstractColleAgue {// Jangan membuat koneksi dengan mediator di konstruktor // Collegea publik (AbstractMediator Mediator) {// super (mediator); //} // Setiap kolega spesifik harus memiliki bagiannya sendiri dari bagiannya sendiri, dan tidak perlu dikaitkan dengan dunia luar yang batal self () {System.out.println ("Colleaguea -> lakukan bagian Anda dari bagiannya ..."); } // Setiap kolega tertentu selalu perlu berinteraksi dengan dunia luar, menangani logika ini dan mengatur pekerjaan melalui mediator public void out () {System.out.println ("Colleaguea -> meminta kolega B untuk melakukan bagian dari bagiannya ..."); super.mediator.execute ("rekan", "self"); }} // Kolega spesifik B Class Colleageeb memperluas AbstractColleague {// berhenti membangun koneksi dengan mediator dalam konstruktor // kolega publik (mediator abstrakmediator) {// super (mediator); //} public void self () {System.out.println ("colleageb -> lakukan bagian Anda ..."); } public void out () {System.out.println ("COLEAGUEB -> Tanya kolega A untuk melakukan bagian Anda ..."); super.mediator.execute ("colleaguea", "self"); }}
Perantara yang dimodifikasi:
// Abstrak Perantara Abstrak Abstrak AbstractMediator {// Perantara harus mempertahankan informasi kontak dari beberapa rekan yang dilindungi Hashtable <String, AbstractColleGue> rekan = hashtable baru <string, AbstractColleAgue> (); // Perantara dapat secara dinamis membuat kontak dengan kolega public void AddColleAgue (nama string, AbstractColleague C) {// membantu rekan tertentu membuat kontak dari perantara C.SetMediator (ini); this.colleagues.put (name, c); } // Perantara juga dapat secara dinamis mencabut kontak dengan rekan kerja public void deletecolleague (nama string) {this.colleagues.remove (name); } // Perantara harus memiliki operasi untuk menangani logika, menetapkan tugas, dan mempromosikan komunikasi di antara kolega abstrak public abstrak mengeksekusi (nama string, metode string); } // Kelas Public Kelas Public Klien Test {public static void main (string [] args) {// Buat perantara abstractMediator mediator = mediator baru (); // Konstruktor digunakan untuk mendaftarkan perantara agar kolega spesifik untuk berhubungan // colleaguea colleaguea = kolega baru (mediator); // kolegaeb kolegaeb = kolega baru (mediator); Colleaguea colleaguea = colleaguea baru (); Rekan kolegaeb = kolega baru (); // Perantara menetapkan kontak dengan masing -masing mediator kolega. Mediator.AddColleague ("Rekan", kolegaeb); // rekan kerja mulai bekerja koleagea.self (); colleaguea.out (); System.out.println ("=============================================== ==================================================================== ==================================================================== ==================================================================== ==================================================================== ==================================================================== ==================================================================== ====================================================================Hasil setelah tes sama seperti sebelum modifikasi.