Rantai Tanggung Jawab Definisi: Rantai Tanggung Jawab (COR) adalah serangkaian kelas yang mencoba memproses permintaan. Dengan kata lain, ketika suatu permintaan datang, proses Kelas A terlebih dahulu.
Cara menggunakan model rantai tanggung jawab
Meskipun paragraf ini menggunakan COR, ia juga menunjukkan apa itu COR.
Ada antarmuka penangan:
Salinan kode adalah sebagai berikut:
penangan antarmuka publik {
public void handlerequest ();
}
Ini adalah contoh penanganan permintaan.
◆ Solusi pertama yang terlintas dalam pikiran adalah: tambahkan beberapa permintaan ke antarmuka:
Salinan kode adalah sebagai berikut:
penangan antarmuka publik {
public void handehelp ();
public void handleprint ();
public void handleFormat ();
}
Secara khusus, ini adalah kode untuk mengimplementasikan antarmuka:
Salinan kode adalah sebagai berikut:
Kelas publik ConcreteHandler mengimplementasikan penangan {
penerus penangan pribadi;
Public ConcreteHandler (Penerus Penangan) {
this.successor = penerus;
}
public void handhelp () {
// Kode khusus untuk memproses permintaan bantuan ...
}
public void handlePrint () {
// Jika itu adalah cetakan, putar proses cetak
penerus.handleprint ();
}
public void handleFormat () {
// Jika formatnya, buka format proses
penerus.handleformat ();
}
}
Ada tiga kelas implementasi spesifik seperti itu, di atas, yang memproses bantuan, dan memproses format cetak dan pemrosesan, yang mungkin merupakan ide pemrograman yang paling umum digunakan.
Meskipun idenya sederhana dan jelas, ada masalah ekstensi.
◆ Solusi kedua: Ubah setiap permintaan menjadi antarmuka, jadi kami memiliki kode berikut:
Salinan kode adalah sebagai berikut:
Helphandler antarmuka publik {
public void handehelp ();
}
Public Interface Printhandler {
public void handleprint ();
}
format antarmuka publik {
public void handleFormat ();
}
Kelas Publik ConcreteHandler
mengimplementasikan Helphandler, Printhandler, Formathandlet {
Helphandler Privat Membantu Bantuan;
printhandler printsuccessor pribadi;
format format privat;
Public ConcreteHandler (Helphandler Helpuccessor, Printhandler Printsuccessor, Formathandler Formatcessor)
{
this.helpsuccessor = Membantuccessor;
this.printsuccessor = printsuccessor;
this.formatsuccessor = formatuccessor;
}
public void handhelp () {
.........
}
public void handlePrint () {this.printsuccessor = printsuccessor;}
public void handleFormat () {this.FormatCuccessor = formatCcessor;}
}
Saat menambahkan permintaan permintaan baru, metode ini hanya menghemat jumlah modifikasi antarmuka, dan implementasi antarmuka dari ConcreteHandler juga perlu dimodifikasi. Dan kodenya jelas tidak sederhana dan indah.
◆ Solusi 3: Hanya satu metode parameterisasi yang digunakan dalam antarmuka penangan:
Salinan kode adalah sebagai berikut:
penangan antarmuka publik {
public void handleRequest (permintaan string);
}
Maka kode implementasi pawang adalah sebagai berikut:
Kelas publik ConcreteHandler mengimplementasikan penangan {
penerus penangan pribadi;
Public ConcreteHandler (Penerus Penangan) {
this.successor = penerus;
}
public void handleRequest (String Request) {
if (request.equals ("help")) {
// Ini kode spesifik untuk menangani bantuan}
// Lewati ke penerus berikutnya.handle (permintaan);
}
}
}
Pertama -tama mari kita asumsikan bahwa permintaan adalah tipe string. Tentu saja kami dapat membuat permintaan kelas khusus
◆ Solusi terakhir: Kode penangan antarmuka adalah sebagai berikut:
Salinan kode adalah sebagai berikut:
penangan antarmuka publik {
public void handlerequest (permintaan permintaan);
}
Definisi Kelas Permintaan:
Permintaan kelas publik {
tipe string pribadi;
Permintaan publik (tipe string) {this.type = type;}
public string getType () {return type;}
public void execute () {
// Kode perilaku spesifik nyata} permintaan permintaan}
}
Maka kode implementasi pawang adalah sebagai berikut:
Salinan kode adalah sebagai berikut:
Kelas publik ConcreteHandler mengimplementasikan penangan {
penerus penangan pribadi;
Public ConcreteHandler (Penerus Penangan) {
this.successor = penerus;
}
public void handleRequest (permintaan permintaan) {
if (minta instance dari helprequest) {
// Ini kode spesifik untuk menangani bantuan} lain jika (permintaan instance dari printrequest) {
request.execute ();
}kalau tidak
// Lewati ke penerus berikutnya.handle (permintaan);
}
}
}
Solusi ini adalah cor.
1. Keuntungan COR: Karena tidak mungkin untuk memprediksi jenis permintaan mana dari dunia luar, jika setiap kelas menghadapi permintaan yang tidak dapat diproses, hanya menyerah. Ini tidak diragukan lagi mengurangi kopling antar kelas.
2. Kerugian COR adalah ketidakefisienannya, karena penyelesaian permintaan mungkin harus dilalui sampai akhir sebelum dapat diselesaikan. Dalam Java AWT1.0, penanganan tombol tikus adalah menggunakan COR.
Skalabilitasnya buruk karena di COR, harus ada penangan antarmuka terpadu.