Artikel ini menjelaskan penggunaan mode rantai tanggung jawab bagi siswa untuk mengambil cuti. Bagikan untuk referensi Anda, sebagai berikut:
1. Definisi Pola
Dalam model rantai tanggung jawab, banyak objek dihubungkan oleh referensi ke rumah mereka berikutnya oleh masing -masing objek, membentuk rantai. Permintaan aplikasi klien disahkan pada rantai ini sampai objek pada rantai memutuskan untuk memproses permintaan. Klien yang membuat permintaan ini tidak tahu objek mana yang pada rantai pada akhirnya menangani permintaan, yang memungkinkan sistem untuk secara dinamis mengatur ulang rantai dan menetapkan tanggung jawab tanpa mempengaruhi klien.
(1) Peran prosesor abstrak: Tentukan antarmuka untuk permintaan pemrosesan. Jika diperlukan, antarmuka dapat menentukan metode untuk mengatur dan mengembalikan referensi ke rumah berikutnya. Peran ini biasanya diimplementasikan oleh Java Abstract Class atau Java Interface.
(2) Peran pemrosesan khusus: Setelah menerima permintaan, prosesor spesifik dapat memilih untuk memproses permintaan atau meneruskan permintaan ke rumah berikutnya.
2. Contoh model
1 analisis pola
Kami meminjam cuti siswa untuk menggambarkan model ini
2 Diagram kelas statis pola rantai tanggung jawab
3 contoh kode
3.1 Antarmuka Siswa Istudent
Paket com.demo.chain.message;/** * Antarmuka Siswa * * @Author * */Antarmuka Publik IStudent {/** * Dapatkan status kondisi siswa * * 0: Hal -hal kecil (monitor kelas dapat menangani hal -hal yang dapat ditangani oleh prinsipal * * / ** * Dapatkan pesan cuti siswa * * @return */ string publik getRequestMessage ();}3.2 Siswa menyadari seorang siswa
Paket com.demo.chain.message;/** * kelas implementasi siswa * * @author * */siswa kelas publik mengimplementasikan istudent {// ukuran kondisi swasta int state = -1; // Pesan Perpisahan Pesan String Final Pribadi; siswa publik (status int, pesan string) {this.state = state; this.message = pesan; } / ** * Dapatkan status cuti siswa * * 0: Hal -hal kecil (monitor kelas dapat menangani) * * 1: Monitor kelas tidak dapat menangani hal -hal yang dapat ditangani oleh guru * * * 2: Guru tidak dapat menangani hal -hal yang dapat ditangani oleh kepala sekolah * * * * / public int getState () {return this.state; } / ** * Dapatkan pesan cuti siswa * * @return * / string publik getRequestMessage () {return this.message; }}3.3 Antarmuka pemrosesan abstrak-Ihandler
Paket com.demo.chain.handle; import com.demo.chain.message.istudent;/** * Antarmuka prosesor abstrak * * @author * */antarmuka publik Ihandler {// Permintaan proses public void handleRequest (siswa IStudent); // Atur pawasan publler berikutnya setHandler (Ihandler Handler);}3.4 Abstracthandler
Paket com.demo.chain.handle; import com.demo.chain.message.istudent;/** * abstrak handler * * @author * */kelas abstrak publik abstracthandler mengimplementasikan iHandler {// handler next handler private iHandler handler; // Tinggalkan tingkat int private int state = -1; // Level Pengaturan Konstruktor Makhluk Publik (status int) {this.state = state; } // Menangani permintaan ke subkelas untuk menangani proses void abstrak publik pemrosesan tertentu (siswa Istudent); // Menangani permintaan public void handleRequest (siswa IStudent) {// Jika objek siswa ada jika (siswa! = Null) {if (this.state == student.getState ()) {// Jika level cuti konsisten dengan saat ini, objek saat ini akan diproses this.process (siswa); } else {if (this.handler! = null) {System.out.println ("Minta pemimpin superior untuk membalas!"); // Jika objek saat ini tidak dapat diproses, itu akan diserahkan ke prosesor berikutnya untuk memproses ini. }}}}} // Setel prosesor public void setHandler (iHandler handler) {this.handler = handler; }}3.5 Skuad Leadhandler
Paket com.demo.chain.handle; import com.demo.chain.message.istudent;/** * abstrak handler * * @author * */kelas abstrak publik abstracthandler mengimplementasikan iHandler {// handler next handler private iHandler handler; // Tinggalkan tingkat int private int state = -1; // Level Pengaturan Konstruktor Makhluk Publik (status int) {this.state = state; } // Menangani permintaan ke subkelas untuk menangani proses void abstrak publik pemrosesan tertentu (siswa Istudent); // Menangani permintaan public void handleRequest (siswa IStudent) {// Jika objek siswa ada jika (siswa! = Null) {if (this.state == student.getState ()) {// Jika level cuti konsisten dengan saat ini, objek saat ini akan diproses this.process (siswa); } else {if (this.handler! = null) {System.out.println ("Minta pemimpin superior untuk membalas!"); // Jika objek saat ini tidak dapat diproses, itu akan diserahkan ke prosesor berikutnya untuk memproses ini. }}}}} // Setel prosesor public void setHandler (iHandler handler) {this.handler = handler; }}3.6 Guru-TeacherHandler
Paket com.demo.chain.impl; import com.demo.chain.handle.abstracthandler; import com.demo.chain.message.istudent;/** * penangan guru * * @author */kelas publik TeacherHandler memperluas abstracthandler {publichandler () {1); } // Subkelas permintaan pemrosesan khusus @Override Public Void Process (Istudent Student) {System.out.println ("Balas Guru:" + Student.GetRequestMessage ()); }}3.7 Kepala Sekolah-SChoolmasterhandler
Paket com.demo.chain.impl; import com.demo.chain.handle.abstracthandler; import com.demo.chain.message.istudent;/** * pawang utama * * @author */Kelas publik. } // Subkelas permintaan pemrosesan khusus @Override Public Void Process (Istudent Student) {System.out.println ("Balas Kepala Sekolah:" + Student.getRequestMessage ()); }}3.8 Penampilan Kelas 1 Proseshandler
Paket com.demo.chain.process; import com.demo.chain.handle.ihandler; import com.demo.chain.impl.schoolmasterhandler; impor com.demo.mlain.impl.squadleaderller; impor com.demo.chain.impl.teacherller; Asosiasi Rantai * * @Author * */Process Class PublicHandler {// Class Leader Handler Private Final Ihandler Sqmshandler; // Guru Handler Private Final Ihandler Techhandler; // Prinsipal Handler Private Final Ihandler Scmshandler; // Singleton Mode Private Static ProcessHandler ProcessHandler = new ProcessHandler (); / *** Metode Konstruktor Untuk membuat rantai tanggung jawab untuk pemrosesan cuti*/ Private ProcessHandler () {// Buat Objek Pemrosesan // Pemimpin Kelas This.sqmshandler = SkuadleaderHandler baru (); // guru this.techhandler = TeacherHandler baru (); // prinsipal this.scmshandler = new SchoolmasterHandler (); / *** Tetapkan rantai tanggung jawab*/ // Tetapkan penangan berikutnya dari pemimpin kelas: guru this.sqmshandler.sethandler (this.techhandler); // Atur pawang berikutnya dari guru: prinsipal this.techhandler.sethandler (this.scmshandler); } / ** * Dapatkan instance objek singleton * * @return * / public static ProcessHandler getInstance () {return ProcessHandler; } / ** * Kirim permintaan cuti * * @param pesan * / public void sendMessage (siswa IStudent) {// Kirim ke penangan pertama: pemimpin kelas menangani this.sqmshandler.handleRequest (siswa); }}3.9 Klien-Klien
Paket com.demo; import java.util.random; import com.demo.chain.message.istudent; import com.demo.chain.message.student; import com.demo.chain.process.processhandler;/** aplikasi utama * * @author * */klien kelas publik {/** ** ** args) {// Dapatkan objek penampilan ProcessHandler ProcessHandler = ProcessHandler.getInstance (); // Buat objek bilangan acak untuk secara acak menghasilkan objek siswa acak acak = acak baru (); untuk (int i = 0; i <3; i ++) {// Dapatkan nomor acak int radom = random.nextInt (3); Siswa IStudent = Siswa Baru (Radom, "Siswa" + I + "Saya sakit, saya ingin pergi!"); System.out.println ("############################################# ######################################################## ######################################################## ######################################################### // Proses Process ProcessHandler.SendMessage (Siswa); System.out.println ("############################################/n"); }}}4 hasil berjalan
########################################################.
Minta balasan dari pemimpin superior!
Minta balasan dari pemimpin superior!
Balasan Kepala Sekolah: Siswa 0 sakit dan ingin mengambil cuti!
########################################################.
########################################################.
Minta balasan dari pemimpin superior!
Minta balasan dari pemimpin superior!
Balasan Kepala Sekolah: Siswa 1 sakit dan ingin pergi!
########################################################.
########################################################.
Monitor kelas disetujui: Siswa 2 sakit dan ingin mengambil cuti!
########################################################.
AKU AKU AKU. Prinsip -prinsip desain dari pola ini
1 prinsip "dekat-dekat"
2 prinsip tanggung jawab tunggal
4. Gunakan kesempatan
(1) Ada beberapa objek yang memproses permintaan yang sama. Masih tidak pasti mana yang digunakan untuk menanganinya. Hanya ditentukan saat runtime yang objek menanganinya.
(2) Pesan memiliki banyak penerima, dan objek penerima tidak jelas. Anda hanya perlu mengirim pesan ke salah satu objek dan menanganinya secara internal.
(3) Beberapa objek pemrosesan dari pesan yang sama dapat meningkat atau berkurang secara dinamis, dan perlu ditentukan secara dinamis.
5. Diagram kelas statis pola rantai tanggung jawab
Untuk konten yang lebih terkait dengan Java, pembaca yang tertarik dengan situs ini dapat melihat topik: "Tutorial Struktur Data Java dan Algoritma", "Ringkasan Java Operation Dom Node Tips", "Ringkasan Tips Operasi Java File dan Direktori" dan "Ringkasan Java Cache Tips"
Saya harap artikel ini akan membantu pemrograman Java semua orang.