Corak Mediator di Jawa

1. Gambaran keseluruhan

Dalam artikel ini, kita akan melihat Corak Mediator, salah satu corak tingkah laku GoF . Kami akan menerangkan tujuannya dan menerangkan kapan kami harus menggunakannya.

Seperti biasa, kami juga akan memberikan contoh kod ringkas.

2. Corak Mediator

Dalam pengaturcaraan berorientasikan objek, kita harus selalu berusaha merancang sistem sedemikian rupa sehingga komponen digabungkan secara longgar dan dapat digunakan kembali . Pendekatan ini menjadikan kod kami lebih senang dijaga dan diuji.

Akan tetapi, dalam kehidupan nyata, kita sering perlu menangani sekumpulan objek bergantung yang kompleks. Ini adalah ketika Pola Pengantara mungkin berguna.

Tujuan Pola Mediator adalah untuk mengurangkan kerumitan dan kebergantungan antara objek yang berpasangan erat yang berkomunikasi secara langsung antara satu sama lain . Ini dicapai dengan membuat objek mediator yang menjaga interaksi antara objek bergantung. Akibatnya, semua komunikasi melalui orang tengah.

Ini mendorong gandingan longgar, kerana sekumpulan komponen yang bekerjasama tidak perlu lagi berinteraksi secara langsung. Sebaliknya, mereka hanya merujuk kepada objek pengantara tunggal. Dengan cara ini, lebih mudah untuk menggunakan semula objek ini di bahagian lain sistem.

3. Diagram UML Corak Mediator

Sekarang mari kita lihat coraknya secara visual:

Dalam rajah UML di atas, kita dapat mengenal pasti peserta berikut:

  • Mediator menentukan antara muka yang digunakan oleh rakan - rakan untuk berkomunikasi
  • Rakan sekerja mentakrifkan kelas abstrak yang memegang satu rujukan kepada Mediator
  • ConcreteMediator merangkum logik interaksi antara objek Colleague
  • ConcreteColleague1 dan ConcreteColleague2 hanya berkomunikasi melalui Mediator

Seperti yang kita lihat, objek Rakan tidak saling merujuk langsung. Sebaliknya, semua komunikasi dilakukan oleh Mediator .

Oleh itu, ConcreteColleague1 dan ConcreteColleague2 dapat digunakan dengan lebih mudah.

Sekiranya kita perlu mengubah cara kerja rakan sekerja , kita hanya perlu mengubah logik ConcreteMediator . Atau kita boleh membuat pelaksanaan baru Mediator.

4. Pelaksanaan Java

Sekarang setelah kita mempunyai idea yang jelas mengenai teori ini, mari kita lihat contoh untuk memahami konsep dalam praktiknya dengan lebih baik.

4.1. Contoh Senario

Bayangkan kita sedang membina sistem penyejukan sederhana yang terdiri daripada kipas, bekalan kuasa, dan butang. Menekan butang akan menghidupkan atau mematikan kipas. Sebelum menghidupkan kipas, kita perlu menghidupkan kuasa. Begitu juga, kita harus mematikan kuasa sebaik sahaja kipas dimatikan.

Sekarang mari kita lihat contoh pelaksanaannya:

public class Button { private Fan fan; // constructor, getters and setters public void press(){ if(fan.isOn()){ fan.turnOff(); } else { fan.turnOn(); } } }
public class Fan { private Button button; private PowerSupplier powerSupplier; private boolean isOn = false; // constructor, getters and setters public void turnOn() { powerSupplier.turnOn(); isOn = true; } public void turnOff() { isOn = false; powerSupplier.turnOff(); } }
public class PowerSupplier { public void turnOn() { // implementation } public void turnOff() { // implementation } }

Seterusnya, mari kita uji fungsi:

@Test public void givenTurnedOffFan_whenPressingButtonTwice_fanShouldTurnOnAndOff() { assertFalse(fan.isOn()); button.press(); assertTrue(fan.isOn()); button.press(); assertFalse(fan.isOn()); }

Semuanya nampak berjalan lancar. Tetapi perhatikan bagaimana kelas Button, Fan, dan PowerSupplier digabungkan rapat . The Button beroperasi secara langsung pada Fan dan Fan berinteraksi dengan kedua-dua butang dan PowerSupplier.

Akan sukar untuk menggunakan semula kelas Button dalam modul lain. Juga, jika kita perlu menambahkan bekalan kuasa kedua ke dalam sistem kita, maka kita harus mengubah logik kelas Fan .

4.2. Menambah Corak Mediator

Sekarang, mari kita laksanakan Mediator Pattern untuk mengurangkan kebergantungan antara kelas kita dan menjadikan kodnya lebih dapat digunakan semula.

Pertama, mari memperkenalkan kelas Mediator :

public class Mediator { private Button button; private Fan fan; private PowerSupplier powerSupplier; // constructor, getters and setters public void press() { if (fan.isOn()) { fan.turnOff(); } else { fan.turnOn(); } } public void start() { powerSupplier.turnOn(); } public void stop() { powerSupplier.turnOff(); } }

Seterusnya, mari kita ubah kelas yang tinggal:

public class Button { private Mediator mediator; // constructor, getters and setters public void press() { mediator.press(); } }
public class Fan { private Mediator mediator; private boolean isOn = false; // constructor, getters and setters public void turnOn() { mediator.start(); isOn = true; } public void turnOff() { isOn = false; mediator.stop(); } }

Sekali lagi, mari kita uji fungsi:

@Test public void givenTurnedOffFan_whenPressingButtonTwice_fanShouldTurnOnAndOff() { assertFalse(fan.isOn()); button.press(); assertTrue(fan.isOn()); button.press(); assertFalse(fan.isOn()); }

Sistem penyejukan kami berfungsi seperti yang diharapkan.

Setelah kami melaksanakan Mediator Pattern, tidak ada kelas Button , Fan , atau PowerSupplier yang berkomunikasi secara langsung . Mereka hanya mempunyai satu rujukan kepada Mediator.

Sekiranya kita perlu menambahkan bekalan kuasa kedua pada masa akan datang, yang harus kita lakukan ialah mengemas kini logik Mediator ; Kelas butang dan kipas tetap tidak tersentuh.

Contoh ini menunjukkan betapa mudahnya kita memisahkan objek yang bergantung dan menjadikan sistem kita lebih mudah dijaga.

5. Bilakah Menggunakan Corak Mediator

The Mediator Pattern is a good choice if we have to deal with a set of objects that are tightly coupled and hard to maintain. This way we can reduce the dependencies between objects and decrease the overall complexity.

Additionally, by using the mediator object, we extract the communication logic to the single component, therefore we follow the Single Responsibility Principle. Furthermore, we can introduce new mediators with no need to change the remaining parts of the system. Hence, we follow the Open-Closed Principle.

Sometimes, however, we may have too many tightly coupled objects due to the faulty design of the system. If this is a case, we should not apply the Mediator Pattern. Instead, we should take one step back and rethink the way we've modeled our classes.

Seperti semua corak lain, kita perlu mempertimbangkan kes penggunaan khusus kita sebelum melaksanakan Pola Mediator secara membuta tuli .

6. Kesimpulannya

Dalam artikel ini, kami belajar mengenai Pola Mediator. Kami menjelaskan masalah apa yang diselesaikan oleh corak ini dan kapan kita harus mempertimbangkan untuk menggunakannya. Kami juga menerapkan contoh ringkas corak reka bentuk.

Seperti biasa, sampel kod lengkap boleh didapati di GitHub.