Chain of Responsibility
نمط سلسلة المسؤولية Chain of Responsibility
Chain of Responsibility يمرّر الطلب عبر سلسلة من المعالجين، وكل معالج يقرر إما يتعامل مع الطلب أو يمرره للمعالج التالي.
كل معالج (Handler) يحتفظ بمرجع للمعالج التالي في السلسلة. الطلب يبدأ من أول معالج، وينتقل تلقائيًا حتى يجده معالج قادر على التعامل معه أو تنتهي السلسلة. الأساس النظري وراء middleware في Express/Next.js: كل دالة وسيطة تقرر تعالج الطلب أو تستدعي next() لتمريره.
الصياغة
handler1.setNext(handler2).setNext(handler3); handler1.handle(request);
📄 مثال
class Handler {
setNext(h) { this.next = h; return h; }
handle(req) { if (this.next) return this.next.handle(req); console.log("لا يوجد معالج"); }
}
class AuthHandler extends Handler {
handle(req) { if (!req.token) return console.log("مرفوض"); super.handle(req); }
}
class LoggerHandler extends Handler {
handle(req) { console.log(`طلب من ${req.user}`); super.handle(req); }
}
const auth = new AuthHandler();
auth.setNext(new LoggerHandler());
auth.handle({ user: "سارة", token: "abc" }); // طلب من سارةأهم النقاط
| النقطة | الوظيفة |
|---|---|
| التصنيف | نمط سلوكي (Behavioral) |
| يحل مشكلة | شروط متشعبة لاختيار من يعالج الطلب بين عدة معالجين محتملين |
| أشهر تطبيق واقعي | middleware في Express/Next.js — كل طبقة تعالج أو تستدعي next() |
⚠️ أخطاء شائعة
- نسيان تمرير الطلب للمعالج التالي أو عدم وجود معالج افتراضي بنهاية السلسلة — فيضيع الطلب بصمت
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار OOP الكامل بالعربي.