Berbagi teknologi

Pola desain rantai pola tanggung jawab

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Pola Rantai Tanggung Jawab adalah pola desain perilaku yang memungkinkan beberapa objek menangani permintaan secara berurutan, dan setiap objek dapat memilih apakah akan menangani permintaan atau meneruskannya ke objek berikutnya. Pola ini memberikan fleksibilitas dan skalabilitas yang lebih besar dengan memisahkan pengirim dan penerima permintaan. Berikut ini adalah pengenalan rinci tentang model rantai tanggung jawab:

1. Definisi dan gagasan inti

Inti dari model rantai tanggung jawab adalah merancang rantai permintaan dan mengidentifikasi ujung rantai. Ini menghubungkan beberapa objek penanganan permintaan ke dalam sebuah rantai dan memungkinkan permintaan meneruskan rantai tersebut hingga objek dalam rantai tersebut memutuskan untuk menangani permintaan tersebut. Klien yang membuat permintaan tidak mengetahui objek mana dalam rantai yang pada akhirnya akan menangani permintaan tersebut, yang memungkinkan sistem untuk mengatur ulang dan menetapkan tanggung jawab secara dinamis tanpa mempengaruhi klien.

2. Diagram kelas dan peran utama

Diagram Kelas:

Model rantai tanggung jawab terutama mencakup peran-peran berikut:

  1. Penangan abstrak (Handler) : Menentukan antarmuka untuk memproses permintaan. Jika diperlukan, antarmuka dapat menentukan metode untuk mengatur dan mengembalikan referensi ke antarmuka berikutnya. Peran ini biasanya diimplementasikan oleh kelas abstrak atau antarmuka.

  2. Penangan Beton : Setelah menerima permintaan, pemroses tertentu dapat memilih untuk memproses permintaan tersebut atau meneruskan permintaan tersebut ke pihak berikutnya. Karena pengolah beton menyimpan referensi ke rumah berikutnya, pengolah beton dapat mengakses rumah berikutnya jika diperlukan.

  3. Kelas klien (Klien): Membuat rantai pemrosesan dan mengirimkan permintaan ke objek prosesor tertentu dari kepala rantai.

3. Skenario yang berlaku

Model rantai tanggung jawab cocok untuk skenario berikut:

  1. Beberapa objek secara bersama-sama memproses suatu tugas: Misalnya, sistem persetujuan bertingkat meneruskan permintaan persetujuan ke tingkat pemberi persetujuan berikutnya berdasarkan wewenang dan tingkat pemberi persetujuan hingga diperoleh hasil persetujuan akhir.

  2. Alur pemrosesan kombinasi dinamis: Dengan mengonfigurasi rantai tanggung jawab secara fleksibel, objek pemrosesan dapat digabungkan secara dinamis untuk mengimplementasikan proses pemrosesan yang berbeda.

  3. Hindari hubungan langsung antara pengirim dan penerima permintaan: Dengan meneruskan permintaan ke rantai tanggung jawab, pengirim permintaan tidak perlu mengetahui objek pemrosesan spesifik, sehingga mengurangi ketergantungan antar objek.

4. Kelebihan dan Kekurangan

keuntungan
  1. Kurangi kopling: Ini memisahkan pengirim dan penerima permintaan. Permintaan hanya dikirim, tidak peduli siapa yang menanganinya.
  2. Peningkatan fleksibilitas dalam penetapan objek: Memungkinkan penambahan atau penghapusan tanggung jawab secara dinamis dengan mengubah anggota dalam rantai atau memindahkan urutannya.
  3. Sederhanakan objek: Objek tidak perlu mengetahui struktur rantainya.
  4. Akan lebih mudah untuk menambahkan kelas pemrosesan permintaan baru: Mengikuti prinsip pembukaan dan penutupan, prosesor baru dapat ditambahkan ke rantai tanggung jawab kapan saja tanpa mengubah kode yang ada, sehingga memberikan skalabilitas yang baik.
kekurangan
  1. Tidak ada jaminan bahwa permintaan tersebut akan diterima: Jika rantai tanggung jawab tidak dikonfigurasi dengan benar, atau prosesor tidak menangani permintaan dengan benar, permintaan tersebut mungkin tidak diproses.
  2. Masalah kinerja: Ketika rantai tanggung jawab terlalu panjang atau permintaan dalam rantai tanggung jawab sering diabaikan, kinerja mungkin terpengaruh.
  3. Proses debug tidak nyaman: Ketika rantai tanggung jawab sangat panjang dan memiliki banyak tautan, logikanya mungkin menjadi lebih rumit selama proses debug karena pendekatan rekursif.

5. Skenario penerapan

Model rantai tanggung jawab banyak digunakan di banyak bidang, termasuk namun tidak terbatas pada:

  1. Sistem pencatatan: Meneruskan pesan log ke logger yang berbeda sesuai dengan level log, seperti logger konsol, logger file, logger database, dll.
  2. Sistem penanganan pengecualian: Mengklasifikasikan pengecualian menurut jenisnya, seperti pencatatan, pemberitahuan email, tampilan pengecualian, dll.
  3. Sistem persetujuan bertingkat: Misalnya persetujuan cuti, persetujuan pembelian, dan lain-lain, permintaan persetujuan diteruskan ke pemberi persetujuan tingkat berikutnya sesuai dengan kewenangan dan tingkat pemberi persetujuan.

6. Contoh implementasi

Berikut adalah contoh implementasi sederhana dari pola rantai tanggung jawab, yang digunakan untuk memproses pesan log dan meneruskan pesan ke prosesor yang berbeda sesuai dengan tingkat log (seperti DEBUG, INFO, WARN, ERROR):

  1. // 抽象处理者
  2. abstract class LogHandler {
  3. protected int level;
  4. protected LogHandler nextHandler;
  5. public void setNextHandler(LogHandler nextHandler) {
  6. this.nextHandler = nextHandler;
  7. }
  8. //这个是精髓:他除了处理自己的逻辑,还会调用nextHandler进行处理
  9. public void logMessage(int level, String message) {
  10. if (this.level <= level) {
  11. write(message);
  12. }
  13. if (nextHandler != null) {
  14. nextHandler.logMessage(level, message);
  15. }
  16. }
  17. abstract protected void write(String message);
  18. }
  19. // 具体处理者:ErrorLogHandler
  20. class ErrorLogHandler extends LogHandler {
  21. public ErrorLogHandler(int level) {
  22. this.level = level;
  23. }
  24. @Override
  25. protected void write(String message) {
  26. System.out.println("ErrorLogHandler: " + message);
  27. }
  28. }
  29. // 具体处理者:WarnLogHandler
  30. class WarnLogHandler extends LogHandler {
  31. public WarnLogHandler(int level) {
  32. this.level = level;
  33. }
  34. @Override
  35. protected void write(String message) {
  36. System.out.println("WarnLogHandler: " + message);
  37. }
  38. }
  39. // 具体处理者:InfoLogHandler
  40. class InfoLogHandler extends LogHandler {
  41. public InfoLogHandler(int level) {
  42. this.level = level;
  43. }
  44. @Override
  45. protected void write(String message) {
  46. System.out.println("InfoLogHandler: " + message);
  47. }
  48. }
  49. // 客户端代码
  50. public class ChainPatternDemo {
  51. private static LogHandler getChainOfLoggers() {
  52. // 创建链中的处理者
  53. LogHandler errorLogHandler = new ErrorLogHandler(3);
  54. LogHandler warnLogHandler = new WarnLogHandler(2);
  55. warnLogHandler.setNextHandler(errorLogHandler);
  56. LogHandler infoLogHandler = new InfoLogHandler(1);
  57. infoLogHandler.setNextHandler(warnLogHandler);
  58. return infoLogHandler;
  59. }
  60. public static void main(String[] args) {
  61. LogHandler loggerChain = getChainOfLoggers();
  62. loggerChain.logMessage(1, "This is an informational message.");
  63. loggerChain.logMessage(2, "This is a warning message.");
  64. loggerChain.logMessage(3, "This is an error message.");
  65. }
  66. }

Dalam contoh ini, kita mendefinisikan tiga kelas pengendali log konkrit (ErrorLogHandlerWarnLogHandlerInfoLogHandler ), masing-masing menangani tingkat pesan log yang berbeda. Setiap penangan berisi level (level ), digunakan untuk menentukan apakah pesan pada tingkat ini harus diproses.Dengan menyebutlogMessagemetode, permintaan diteruskan ke penangan pertama dalam rantai (infoLogHandler ), ia memutuskan apakah akan memproses pesan berdasarkan level dan logika pemrosesannya sendiri, dan kemudian (jika tidak diproses) meneruskan permintaan tersebut ke prosesor berikutnya dalam rantai tersebut. Proses ini berlanjut hingga akhir rantai atau hingga permintaan diproses.

Perhatikan bahwa dalam aplikasi nyata, Anda mungkin perlu melakukannyaLogHandler Kelas ini menambahkan lebih banyak metode dan properti untuk mendukung logika dan konfigurasi pemrosesan log yang lebih kompleks. Selain itu, level log biasanya menggunakan enumerasi (enum) alih-alih bilangan bulat untuk meningkatkan keterbacaan dan pemeliharaan kode.

7. Kesimpulan

Pola rantai tanggung jawab mencapai pemrosesan permintaan yang fleksibel dan skalabilitas sistem dengan menghubungkan beberapa objek yang menangani permintaan ke dalam sebuah rantai dan memungkinkan permintaan meneruskan rantai tersebut hingga objek dalam rantai tersebut memutuskan untuk menangani permintaan tersebut.

Jika model rantai tanggung jawab bermanfaat bagi Anda, ingatlah untuk menyukai dan menyimpannya.