Definisi: Memungkinkan banyak objek memiliki kesempatan untuk memproses permintaan, sehingga menghindari hubungan kopling antara pengirim dan penerima permintaan. Hubungkan objek -objek ini ke dalam rantai dan lewati permintaan di sepanjang rantai sampai suatu objek memprosesnya.
Jenis: Pola perilaku
Diagram kelas:
Pertama -tama mari kita lihat sepotong kode:
tes public void (int i, permintaan permintaan) {if (i == 1) {handler1.response (permintaan); } lain jika (i == 2) {handler2.response (permintaan); } lain jika (i == 3) {handler3.response (permintaan); } lain jika (i == 4) {handler4.response (permintaan); } else {handler5.response (permintaan); }} Logika bisnis kode adalah sebagai berikut: Metode ini memiliki dua parameter: Integer I dan permintaan permintaan. Menurut nilai i, yang akan menangani permintaan, jika saya == 1, itu akan ditangani oleh Handler1, jika saya == 2, itu akan ditangani oleh Handler2, dan sebagainya. Dalam pemrograman, metode pemrosesan bisnis semacam ini sangat umum. Semua kelas yang diminta proses termasuk jika ... lain ... pernyataan penilaian bersyarat yang terhubung ke dalam rantai tanggung jawab untuk memproses permintaan. Saya percaya semua orang sering menggunakannya. Keuntungan dari metode ini adalah bahwa ia sangat intuitif, sederhana dan jelas, dan relatif mudah dipelihara, tetapi metode ini juga memiliki beberapa sakit kepala:
Kode membengkak: Dalam aplikasi aktual, kondisi penilaian biasanya tidak begitu sederhana untuk menentukan apakah itu 1 atau 2. Ini mungkin memerlukan perhitungan yang kompleks, mungkin menanyakan database, dll. Ini akan memiliki banyak kode tambahan. Jika ada banyak kondisi penilaian, maka ini jika ... lain ... pernyataan pada dasarnya tidak mungkin dibaca.
Gelar kopling tinggi: Jika kita ingin terus menambahkan kelas yang diminta proses, kita harus terus menambahkan yang lain jika persyaratan penilaian; Selain itu, urutan kondisi ini juga ditulis kepada orang mati. Jika kami ingin mengubah pesanan, kami hanya dapat memodifikasi pernyataan kondisi ini.
Karena kami telah memahami kekurangannya, kami perlu menemukan cara untuk menyelesaikannya. Logika bisnis skenario ini sangat sederhana: jika kondisi 1 terpenuhi, itu akan diproses oleh Handler1, dan jika tidak terpenuhi, itu akan diturunkan; Jika kondisi 2 dipenuhi, itu akan diproses oleh Handler2, dan jika tidak terpenuhi, itu akan diturunkan, dan seterusnya sampai akhir kondisi. Faktanya, metode perbaikan juga sangat sederhana, yaitu menempatkan bagian dari kondisi penilaian ke dalam kelas pemrosesan. Ini adalah prinsip model koneksi tanggung jawab.
Struktur model perusahaan tanggung jawab
Diagram kelas dari pola yang terhubung dengan tanggung jawab sangat sederhana, terdiri dari kelas yang diproses secara abstrak dan serangkaian kelas implementasinya:
Kelas pemrosesan abstrak: Kelas pemrosesan abstrak terutama mencakup variabel anggota yang menunjuk ke kelas pemrosesan berikutnya dan wasit metode yang menangani permintaan. Gagasan utama dari metode HandRequest adalah bahwa jika kondisi pemrosesan dipenuhi, kelas pemrosesan ini akan diproses, jika tidak maka akan diproses oleh Nexthandler.
Kelas Pemrosesan Khusus: Kelas pemrosesan spesifik terutama mengimplementasikan logika pemrosesan spesifik dan kondisi yang berlaku untuk pemrosesan.
Contoh
Model rantai tanggung jawab memiliki dua peran:
Peran penangan abstrak: mendefinisikan antarmuka yang diminta. Jika perlu, Anda dapat mendefinisikan metode untuk mengatur dan mengembalikan referensi ke objek rumah berikutnya.
Peran ConcreteHandler: Jika dapat diproses, proses permintaan. Jika tidak dapat diproses, berikan permintaan ke rumah berikutnya dan biarkan rumah berikutnya menanganinya. Dengan kata lain, menangani permintaan yang dapat ditangani dan dapat mengakses rumah berikutnya.
Kode uji untuk pola di atas adalah sebagai berikut:
Paket ChainOfResp;/***Deskripsi: Peran pemrosesan abstrak*/Publik Abstrak Kelas Handler {Penerjemah penangan yang dilindungi; / ***Deskripsi: Metode pemrosesan*/ public abstrak void handlerRequest (kondisi string); public handler getsuccessor () {Return Suscector; } public void setSuccessor (penangan penangan) {this.successor = penerus; }} package chainOfResp;/** *Description: Detailed handling of roles*/public class ConcreteHandler1 extends Handler { @Override public void handlerRequest(String condition) { // If it is your own responsibility, you will handle it yourself and be responsible for passing it to the next home if(condition.equals("ConcreteHandler1")){ System.out.println( "ConcreteHandler1 handled "); kembali ; } else {System.out.println ("ConcreteHandler1 lulus"); getsuccessor (). HandlerRequest (kondisi); }}} Paket rantaifresp;/***Deskripsi: Penanganan rinci peran*/kelas publik ConcreteHandler2 memperluas handler {@override public void handlerRequest (kondisi string) {// Jika itu adalah tanggung jawab Anda sendiri, Anda akan menangani sendiri dan bertanggung jawab untuk meneruskannya ke rumah berikutnya jika (condition.equals ("concreteLler2") {"eF (" concreteDller2 ") {" eF ("concreteDler2") {"eF (" concrethandller2) {"eF (" concrethandller2) {"eF (" concreteDler2 ") {" eF ("concreteDller2) {" o. "eF (" concrethandller2) {"concrethand2. kembali ; } else {System.out.println ("ConcreteHandler2 lulus"); getsuccessor (). HandlerRequest (kondisi); }}} Paket rantaifresp;/*** Deskripsi: Peran pemrosesan terperinci*/kelas publik ConcreteHandlern Extends Handler {/*** Di sini diasumsikan bahwa N adalah simpul terakhir dari rantai yang harus diproses* dalam situasi aktual, cincin atau pohon mungkin muncul,* Ini tidak harus merupakan simpul terakhir. * */ @Override public void handlerRequest (kondisi string) {System.out.println ("ConcreteHandLern ditangani"); }} Paket chainofresp;/***Deskripsi: Kelas tes*/Kelas Publik Klien {/***Deskripsi:*/public static void main (string [] args) {handler handler1 = new ConcreteHandler1 (); Handler handler2 = new ConcreteHandler2 (); Handler Handlern = ConcreteHandLern baru (); // rantai handler1.setsuccessor (handler2); Handler2.setsuccessor (Handlern); // Misalkan permintaan ini adalah tanggung jawab ConcreteHandler2 Handler1.HandlerRequest ("ConcreteHandler2"); }}
Untuk memberikan contoh ini, dalam lokakarya produksi pabrik mainan, jalur perakitan adalah rantai tanggung jawab. Jika pesawat mainan memiliki perakit shell, perakit engine, assembler baling -baling, dan pengepak model. Ketika pesawat mengalir ke siapa pun objek itu mengalir, ia akan bertanggung jawab untuk memasang bagian yang bertanggung jawab. Setelah bagian ini dipasang, ia akan mengalir ke langkah berikutnya dan tahu bahwa semua lingkungan selesai. Ini adalah rantai tanggung jawab yang dihasilkan. Ada juga rantai inspeksi yang berkualitas, yang dibagi menjadi beberapa bagian, inspeksi shell, inspeksi mesin, inspeksi baling -baling, dan inspeksi pengemasan. Ketika produk diserahkan kepada inspektur untuk menguji bagian yang menjadi tanggung jawabnya, jika ada masalah, itu akan langsung dikeluarkan. Jika tidak ada masalah, itu akan diteruskan ke inspektur berikutnya sampai semua tes selesai. Keduanya adalah rantai tanggung jawab, tetapi perbedaannya adalah bahwa setiap orang akan memproses rantai tanggung jawab dan memproses bagiannya; Sementara setelah penilaian, rantai tanggung jawab untuk inspeksi kualitas akan diproses atau tidak diproses. Ini adalah dua kategori rantai tanggung jawab. Yang terakhir disebut rantai tanggung jawab murni, dan yang pertama disebut rantai tanggung jawab tidak murni. Rantai tanggung jawab murni jarang ada dalam aplikasi praktis. Yang umum adalah rantai tanggung jawab yang tidak murni. Model di atas mensimulasikan rantai tanggung jawab murni untuk ditangani.
Pro dan kontra dari model rantai tanggung jawab
Dibandingkan dengan jika ... lain ..., pola rantai tanggung jawab memiliki kemampuan kopling yang lebih rendah karena mendistribusikan penilaian bersyarat ke dalam berbagai kelas pemrosesan, dan urutan pemrosesan prioritas dari kelas pemrosesan ini dapat ditetapkan sesuka hati. Model rantai tanggung jawab juga memiliki kelemahannya, yang sama dengan pernyataan IF ... lain ... yaitu, sebelum menemukan kelas pemrosesan yang benar, semua kondisi penilaian harus dieksekusi. Ketika rantai tanggung jawab relatif panjang, masalah kinerja lebih serius.
Skenario yang berlaku untuk model rantai tanggung jawab
Sama seperti contoh awal, jika Anda merasa kewalahan saat menggunakan pernyataan if ... lain ... untuk mengatur rantai tanggung jawab dan kodenya terlihat buruk, Anda dapat menggunakan mode rantai tanggung jawab untuk membalasnya.
Meringkaskan
Model rantai tanggung jawab sebenarnya adalah versi fleksibel jika ... lain ... pernyataan. Ini menempatkan kondisi penilaian ini ke dalam setiap kelas pemrosesan. Keuntungan dari ini adalah lebih fleksibel, tetapi juga membawa risiko. Misalnya, ketika menyiapkan hubungan antara kelas pemrosesan sebelum dan sesudah kelas pemrosesan, Anda harus sangat berhati -hati untuk menilai hubungan antara logika bersyarat sebelum dan sesudah kelas pemrosesan, dan berhati -hatilah untuk tidak memiliki referensi melingkar dalam rantai.