Buku Dr. Yan Hong "JAVA and Patterns" dimulai dengan deskripsi pola Mediator:
Pola mediator adalah pola perilaku objek. Pola Mediator merangkum cara sekumpulan objek berinteraksi sehingga tidak perlu mereferensikan satu sama lain secara eksplisit. Hal ini memungkinkan mereka untuk digabungkan secara longgar. Ketika interaksi antara beberapa objek tersebut berubah, tidak serta merta mempengaruhi interaksi antar objek lainnya. Hal ini memastikan bahwa interaksi ini dapat bervariasi secara independen satu sama lain.
Mengapa mediator diperlukan
Seperti terlihat pada gambar di bawah, terdapat banyak sekali objek dalam diagram skematik ini. Objek tersebut dapat mempengaruhi objek lain dan dipengaruhi oleh objek lain, sehingga sering disebut objek Rekan. Rekan kerja ini membentuk perilaku sistem melalui interaksi mereka satu sama lain. Terlihat dari gambar, hampir setiap objek perlu berinteraksi dengan objek lain, dan interaksi ini diwujudkan dalam bentuk hubungan langsung antara satu objek dengan objek lainnya. Ini adalah sistem yang digabungkan secara berlebihan.
Dengan memperkenalkan objek mediator (Mediator), struktur jaringan sistem dapat diubah menjadi struktur bintang yang berpusat pada mediator, seperti terlihat pada gambar di bawah ini. Dalam struktur bintang ini, objek rekannya tidak lagi berinteraksi dengan objek lain melalui koneksi langsung; melainkan berinteraksi dengan objek lain melalui objek mediator. Keberadaan objek mediator menjamin kestabilan struktur objek, artinya struktur sistem tidak akan menimbulkan banyak pekerjaan modifikasi akibat diperkenalkannya objek baru.
Desain berorientasi objek yang baik dapat meningkatkan kolaborasi dan mengurangi penggabungan antar objek. Desain yang dipikirkan dengan matang memecah sistem menjadi sekelompok objek rekan kerja yang bekerja sama, kemudian memberikan tanggung jawab unik kepada setiap objek rekan kerja dan secara tepat mengkonfigurasi hubungan kolaboratif di antara mereka sehingga mereka dapat bekerja sama.
Jika tidak ada motherboard
Seperti kita ketahui bersama, interaksi antara berbagai aksesoris di komputer terutama dilakukan melalui motherboard. Jika komputer tidak memiliki motherboard, maka berbagai aksesoris harus berinteraksi satu sama lain untuk saling mengirimkan data. Dan karena antarmuka masing-masing aksesori berbeda, saat berinteraksi satu sama lain, antarmuka data harus diubah agar cocok.
Untungnya, dengan motherboard, interaksi berbagai aksesori sepenuhnya diselesaikan melalui motherboard. Setiap aksesori hanya perlu berinteraksi dengan motherboard, dan motherboard mengetahui cara menangani semua aksesori, yang membuatnya lebih sederhana.
Struktur pola mediator
Diagram kelas skema untuk pola Mediator ditunjukkan di bawah ini:
Mode mediator mencakup peran berikut:
● Peran mediator abstrak (Mediator): Mendefinisikan antarmuka dari objek kolega ke objek mediator, yang metode utamanya adalah satu (atau lebih) metode peristiwa.
● Peran Mediator Beton (ConcreteMediator): mengimplementasikan metode kejadian yang dideklarasikan oleh mediator abstrak. Mediator spesifik mengetahui semua kelas kolega tertentu dan bertanggung jawab untuk secara khusus mengoordinasikan interaksi antara setiap objek kolega.
● Peran kelas kolega abstrak (Rekan): mendefinisikan antarmuka dari mediator ke objek kolega. Objek kolega hanya mengetahui tentang mediator dan tidak mengetahui objek kolegial lainnya.
● Peran ConcreteColleague: Semua kelas kolega konkret mewarisi dari kelas kolega abstrak. Untuk menjalankan bisnis Anda sendiri, ketika Anda perlu berkomunikasi dengan rekan kerja lainnya, komunikasikanlah dengan mediator yang memegangnya. Mediator akan bertanggung jawab untuk berinteraksi dengan rekan kerja lainnya.
kode sumber
Kode salinan kelas mediator abstrak adalah sebagai berikut:
antarmuka publik Mediator {
/**
* Objek rekan memberi tahu metode mediator ketika ada perubahan.
* Biarkan mediator bertanggung jawab atas interaksi terkait dengan objek rekan lainnya
*/
kekosongan publik diubah (Rekan c);
}
kelas mediator konkrit
Copy kode kodenya sebagai berikut:
kelas publik ConcreteMediator mengimplementasikan Mediator {
//Pegang dan pertahankan rekan A
Rekan Beton pribadiSeorang rekanA;
//Pegang dan pertahankan rekan B
kolega BetonB pribadiB;
public void setColleagueA(ConcreteColleagueA kolegaA) {
this.rekanA = rekanA;
}
public void setColleagueB(ConcreteColleagueB kolegaB) {
this.rekanB = rekanB;
}
@Mengesampingkan
kekosongan publik berubah(Rekan c) {
/**
* Kelas kolega tertentu telah berubah, biasanya memerlukan interaksi dengan kolega lain
* Secara khusus mengoordinasikan objek rekan kerja yang sesuai untuk mencapai perilaku kolaboratif
*/
}
}
kelas kolega abstrak
Copy kode kodenya sebagai berikut:
Rekan kelas abstrak publik {
//Pegang objek mediator
mediator Mediator swasta;
/**
*Konstruktor
*/
Rekan Umum(Mediator mediator){
this.mediator = mediator;
}
/**
* Dapatkan objek mediator yang sesuai dengan kelas kolega saat ini
*/
Mediator publik getMediator() {
mediator pengembalian;
}
}
Kode khusus untuk menyalin kelas yang sama adalah sebagai berikut:
kelas publik ConcreteColleagueA memperluas Rekan {
Rekan Beton publikA(Mediator mediator) {
super(perantara);
}
/**
* Tunjukkan metode untuk melakukan operasi tertentu
*/
operasi kekosongan publik(){
//Beri tahu objek mediator saat Anda perlu berkomunikasi dengan rekan lain
getMediator().berubah(ini);
}
}
Copy kode kodenya sebagai berikut:
kelas publik ConcreteColleagueB memperluas Rekan {
Rekan Beton publikB(Mediator mediator) {
super(perantara);
}
/**
* Tunjukkan metode untuk melakukan operasi tertentu
*/
operasi kekosongan publik(){
//Beri tahu objek mediator saat Anda perlu berkomunikasi dengan rekan lain
getMediator().berubah(ini);
}
}
Gunakan komputer Anda untuk menonton film
Dalam kehidupan sehari-hari, kita sering menggunakan komputer untuk menonton film. Mari kita uraikan proses ini. Setelah disederhanakan, kita asumsikan akan terjadi proses interaktif berikut:
(1) Pertama, drive optik perlu membaca data pada disk optik, lalu memberi tahu motherboard bahwa statusnya telah berubah.
(2) Motherboard memperoleh data dari drive optik dan menyerahkan data tersebut ke CPU untuk dianalisis dan diproses.
(3) Setelah CPU selesai memproses, ia membagi data menjadi data video dan data audio, dan memberi tahu motherboard bahwa ia telah selesai memproses.
(4) Motherboard memperoleh data yang diproses oleh CPU dan meneruskan data tersebut ke kartu grafis dan kartu suara masing-masing untuk menampilkan video dan mengeluarkan suara.
Untuk mengimplementasikan contoh menggunakan pola mediator, perlu dibedakan antara objek rekan dan objek mediator. Jelas sekali, motherboard adalah mediatornya, dan aksesori seperti drive optik, kartu suara, CPU, dan kartu grafis semuanya adalah rekan kerja.
kode sumber
Kode salinan kelas kolega abstrak adalah sebagai berikut:
Rekan kelas abstrak publik {
//Pegang objek mediator
mediator Mediator swasta;
/**
*Konstruktor
*/
Rekan Umum(Mediator mediator){
this.mediator = mediator;
}
/**
* Dapatkan objek mediator yang sesuai dengan kelas kolega saat ini
*/
Mediator publik getMediator() {
mediator pengembalian;
}
}
Rekan sekelas - kode kode copy drive optik adalah sebagai berikut:
CDDriver kelas publik memperluas Rekan{
//Data dibaca dari drive optik
data String pribadi = "";
/**
*Konstruktor
*/
CDDriver publik(mediator mediator) {
super(perantara);
}
/**
* Dapatkan data dibaca dari disk
*/
String publik getData() {
mengembalikan data;
}
/**
* Baca CD
*/
kekosongan publik readCD(){
//Sebelum koma adalah data yang ditampilkan dalam video, dan setelah koma adalah suaranya
this.data = "One Piece, saya bertekad menjadi Raja Bajak Laut";
//Beri tahu motherboard bahwa statusnya telah berubah
getMediator().berubah(ini);
}
}
Kelas rekan —— CPU
Copy kode kodenya sebagai berikut:
CPU kelas publik memperluas Rekan {
//Data video yang terurai
String pribadi videoData = "";
//Data suara yang terurai
String pribadi soundData = "";
/**
*Konstruktor
*/
CPU publik(mediator mediator) {
super(perantara);
}
/**
* Dapatkan data video yang terurai
*/
String publik getVideoData() {
kembalikan data video;
}
/**
* Dapatkan data suara yang terurai
*/
String publik getSoundData() {
kembalikan data suara;
}
/**
* Memproses data dan membagi data menjadi data audio dan video
*/
public void mengeksekusiData(String data){
//Dekomposisi data. Bagian depan adalah data video dan bagian belakang adalah data audio.
String[] array = data.split(",");
ini.videoData = larik[0];
ini.soundData = array[1];
//Beri tahu motherboard bahwa CPU telah menyelesaikan pekerjaannya
getMediator().berubah(ini);
}
}
Kelas rekan - kode kode copy kartu grafis adalah sebagai berikut :
VideoCard kelas publik memperluas Rekan {
/**
*Konstruktor
*/
Kartu Video publik(Mediator mediator) {
super(perantara);
}
/**
* Menampilkan data video
*/
public void showData(Data string){
System.out.println("Anda sedang menonton: "+data);
}
}
Rekan kelas – kode kode copy sound card adalah sebagai berikut :
SoundCard kelas publik meluas Rekan {
/**
*Konstruktor
*/
SoundCard publik(Mediator mediator) {
super(perantara);
}
/**
* Membuat suara berdasarkan data audio
*/
public void soundData(Data string){
System.out.println("Suara: " + data);
}
}
Kode salinan kelas mediator abstrak adalah sebagai berikut:
antarmuka publik Mediator {
/**
* Objek rekan memberi tahu metode mediator ketika ada perubahan.
* Biarkan mediator bertanggung jawab atas interaksi terkait dengan objek rekan lainnya
*/
kekosongan publik diubah (Rekan c);
}
Kode salinan kelas mediator spesifik adalah sebagai berikut:
MainBoard kelas publik mengimplementasikan Mediator {
//Perlu mengetahui kelas rekan untuk berinteraksi dengan-kelas drive optik
CDDriver pribadi cdDriver = null;
//Perlu mengetahui kelas rekan untuk berinteraksi dengan kelas CPU
cpu CPU pribadi = null;
//Perlu mengetahui kelas rekan kerja yang akan diajak berinteraksi - kelas kartu grafis
VideoCard pribadi videoCard = null;
//Perlu mengetahui kelas rekan kerja yang akan diajak berinteraksi - kelas kartu suara
SoundCard pribadi soundCard = null;
kekosongan publik setCdDriver(CDDriver cdDriver) {
ini.cdDriver = cdDriver;
}
kekosongan publik setCpu(CPU cpu) {
ini.cpu = cpu;
}
public void setVideoCard(VideoCard VideoCard) {
this.videoCard = kartu video;
}
public void setSoundCard(SoundCard soundCard) {
this.soundCard = kartu suara;
}
@Mengesampingkan
kekosongan publik berubah(Rekan c) {
if(c instance dari CDDriver){
//Menunjukkan bahwa drive optik telah membaca data
ini.opeCDDriverReadData((CDDriver)c);
}else if(c instance dari CPU){
ini.opeCPU((CPU)c);
}
}
/**
* Tangani interaksi dengan objek lain setelah drive optik membaca data
*/
kekosongan pribadi opeCDDriverReadData(CDDriver cd){
//Pertama, dapatkan data yang dibaca oleh drive optik
String data = cd.getData();
//Transfer data ini ke CPU untuk diproses
cpu.executeData(data);
}
/**
* Tangani interaksi antara CPU dan objek lain setelah memproses data
*/
kekosongan pribadi opeCPU(CPU cpu){
//Dapatkan data yang diproses oleh CPU terlebih dahulu
String videoData = cpu.getVideoData();
String soundData = cpu.getSoundData();
//Transfer data ini ke kartu grafis dan kartu suara untuk ditampilkan
videoCard.showData(videoData);
soundCard.soundData(soundData);
}
}
Kode salinan kelas klien adalah sebagai berikut:
Klien kelas publik {
public static void main(String[] args) {
//Buat mediator - motherboard
Mediator MainBoard = MainBoard baru();
//Buat kelas kolega
CDDriver cd = CDDriver baru(mediator);
CPU cpu = CPU baru (mediator);
VideoCard vc = VideoCard baru (mediator);
SoundCard sc = SoundCard baru(mediator);
//Beri tahu mediator kepada semua rekannya
mediator.setCdDriver(cd);
mediator.setCpu(cpu);
mediator.setVideoCard(vc);
mediator.setSoundCard(sc);
//Mulai menonton film, masukkan disk ke dalam drive optik, dan drive optik mulai membaca disk
cd.bacaCD();
}
}
Hasil yang berjalan adalah sebagai berikut:
Keuntungan Pola Mediator
● kopling longgar
Pola mediator merangkum interaksi antara beberapa objek kolega ke dalam objek mediator, sehingga secara longgar menggabungkan objek kolega dan pada dasarnya mencapai ketergantungan yang saling melengkapi. Dengan cara ini, objek rekan dapat diubah dan digunakan kembali secara mandiri, alih-alih “memindahkan satu tempat dan memengaruhi seluruh tubuh” seperti sebelumnya.
● Kontrol interaksi terpusat
Interaksi beberapa objek rekan diringkas dalam objek mediator untuk manajemen terpusat, sehingga ketika perilaku interaktif ini berubah, Anda hanya perlu memodifikasi objek mediator. Tentu saja, jika itu adalah sistem yang sudah selesai, maka perluas objek mediator tersebut. dan setiap kelas kolega tidak perlu dimodifikasi.
● Banyak-ke-banyak menjadi satu-ke-banyak
Ketika pola mediator tidak digunakan, hubungan antara objek rekan biasanya bersifat banyak ke banyak. Setelah objek mediator diperkenalkan, hubungan antara objek mediator dan objek rekan biasanya menjadi dua arah satu-ke-banyak. yang membuat hubungan antar objek Lebih mudah dipahami dan diimplementasikan.
Kekurangan Pola Mediator
Salah satu kelemahan potensial model mediator adalah sentralisasi yang berlebihan. Jika interaksi objek rekannya sangat besar dan kompleks, ketika semua kompleksitas ini terkonsentrasi pada mediator, maka objek mediator akan menjadi sangat kompleks dan sulit untuk dikelola dan dipelihara.