سلسلة المسؤولية: سلسلة المسؤولية (COR) هي سلسلة من الفصول التي تحاول معالجة الطلب. وبعبارة أخرى ، عندما يأتي الطلب ، يتم تشغيل الفئة "أ" أولاً.
كيفية استخدام سلسلة المسؤولية
على الرغم من أن هذه الفقرة تستخدم COR ، فإنها توضح أيضًا ماهية COR.
هناك واجهة معالج:
نسخة الكود كما يلي:
معالج الواجهة العامة {
public void HandleRequest () ؛
}
هذا مثال على التعامل مع الطلبات.
◆ الحل الأول الذي يتبادر إلى الذهن هو: إضافة طلبات متعددة إلى الواجهة:
نسخة الكود كما يلي:
معالج الواجهة العامة {
public void walledhelp () ؛
public void handleprint () ؛
public void handleformat () ؛
}
على وجه التحديد ، إنه رمز لتنفيذ الواجهة:
نسخة الكود كما يلي:
الطبقة العامة ConcreteHandler تنفذ معالج {
خلف المعالج الخاص
الخرسانة العامة (خليفة معالج) {
this.successor = خليفة ؛
}
public void walledhelp () {
// رمز محدد لمعالجة طلب المساعدة ...
}
public void genleprint () {
// إذا كانت طباعة ، فانتقل إلى المعالجة للطباعة
Suckor.HandlePrint () ؛
}
public void handfformat () {
// إذا كان هذا التنسيق ، فانتقل إلى تنسيق المعالجة
suckor.handleformat () ؛
}
}
هناك ثلاثة فئات تنفيذ محددة من هذا القبيل ، أعلاه ، والتي تقوم بمعالجة المساعدة ، ومعالجة تنسيق الطباعة والمعالجة ، والتي ربما تكون أفكار البرمجة الأكثر استخدامًا.
على الرغم من أن الفكرة بسيطة وواضحة ، إلا أن هناك مشكلة تمديد.
◆ الحل الثاني: تحويل كل طلب إلى واجهة ، لذلك لدينا الرمز التالي:
نسخة الكود كما يلي:
الواجهة العامة Helphandler {
public void walledhelp () ؛
}
الواجهة العامة الطباعة {
public void handleprint () ؛
}
الواجهة العامة formathandler {
public void handleformat () ؛
}
الطبقة العامة الخرسانة
ينفذ Helphandler ، Printhandler ، Formathandlet {
Helphandler الخاص Desistruccessor ؛
طباعة خاصة طباعة printsuccessor ؛
Formathandler Formatsuccessor ؛
ConcreteHandler العام (Helphandler Desistruccessor ، Printhandler Printsuccessor ، Formathandler Formatsuccessor)
{
this.helpsuccessor = Desistruccessor ؛
this.printsuccessor = printsuccessor ؛
this.formatsuccessor = formatsuccessor ؛
}
public void walledhelp () {
.........
}
public void Genleprint () {this.printsuccessor = printsuccessor ؛}
public void handfformat ()
}
عند إضافة طلب طلب جديد ، لا توفر هذه الطريقة إلا مبلغ تعديل الواجهة ، ويجب تعديل تنفيذ الواجهة للخرسانة. ومن الواضح أن الكود ليس بسيطًا وجميلًا.
◆ الحل 3: يتم استخدام طريقة معلمة واحدة فقط في واجهة المعالج:
نسخة الكود كما يلي:
معالج الواجهة العامة {
public void HandleRequest (طلب السلسلة) ؛
}
ثم رمز تنفيذ المعالج كما يلي:
الطبقة العامة ConcreteHandler تنفذ معالج {
خلف المعالج الخاص
الخرسانة العامة (خليفة معالج) {
this.successor = خليفة ؛
}
public void HandleRequest (string request) {
if (request.equals ("Help")) {
// هنا هو الكود المحدد للتعامل مع المساعدة} آخر
// مرور إلى الخلف التالي.
}
}
}
دعنا نفترض أولاً أن هذا الطلب من نوع السلسلة. بالطبع يمكننا إنشاء طلب فئة خاصة
◆ الحل النهائي: رمز معالج الواجهة هو كما يلي:
نسخة الكود كما يلي:
معالج الواجهة العامة {
public void HandleRequest (طلب طلب) ؛
}
تعريف فئة الطلب:
طلب الفئة العامة {
نوع السلسلة الخاصة ؛
طلب عام (نوع السلسلة) {this.type = type ؛}
السلسلة العامة getType () {return type ؛}
void public execute () {
// رمز السلوك الحقيقي المحدد للطلب}
}
ثم رمز تنفيذ المعالج كما يلي:
نسخة الكود كما يلي:
الطبقة العامة ConcreteHandler تنفذ معالج {
خلف المعالج الخاص
الخرسانة العامة (خليفة معالج) {
this.successor = خليفة ؛
}
public void HandleRequest (طلب طلب) {
إذا (request electureof feliveRequest) {
.
request.execute () ؛
}آخر
// مرور إلى الخلف التالي.
}
}
}
هذا الحل هو cor.
1. مزايا COR: لأنه من المستحيل التنبؤ بأي نوع من الطلبات من العالم الخارجي تنتمي ، إذا واجه كل فصل طلبًا لا يمكن معالجته ، فقط الاستسلام. هذا بلا شك يقلل من الاقتران بين الطبقات.
2. إن عيب COR هو عدم كفاءة ذلك ، لأن الانتهاء من الطلب قد يتعين اجتيازه حتى النهاية قبل إكماله. في Java Awt1.0 ، يتم استخدام أزرار الماوس بعد إدخال Java.1.1 ، بدلاً من Cor.
قابلية التوسع سيئة لأنه في COR ، يجب أن يكون هناك معالج واجهة موحدة.