النموذج Chain of Responsibility

الوقت المقدر للقراءة 10 دقيقة.

وصف النموذج

هو عبارة عن مجموعة من الكائنات التي تستقبل طلباً معيناً حيث يقوم كل كائن منها بإنجاز جزء من الطلب وتحويله إلى الكائن الذي يليه.

Chain-of-R

متى نستخدم النموذج Chain of Responsibility

يتم استخدام هذا النموذج بشكل ضمني في أطر العمل الحديثة مثل Laravel وASP.Net MVC كل ما عليك هو فهم كيفية عمل هذا النموذج كي تستطيع التعامل مع هذه الأطر بشكل أفضل.

كيف يعمل النموذج Chain of Responsibility

لشرح هذا النموذج سأضرب المثال التالي:

بفرض لدينا تطبيق وب معين، عند ورود طلب لرابط معين عبر المتصفح إلى تطبيق الوب يمر الطلب عبر عدة مراحل، في المرحلة الأولى يتم التأكد أن الطلب ليس من نمط DoS لحماية التطبيق من هذا النوع من الهجمات، في المرحلة التالية يتم التأكد أن صاحب الطلب قام بتسجيل الدخول (Authenticated)، في المرحلة التالية يتم التأكد أن صاحب الطلب مخول بطلب هذا الرابط (Authorized) وهكذا…. يمر الطلب عبر سلسلة من عمليات المعالجة كل منها تسمى Responsibility.

/**
 *
 * @author Mutasem
 */
public class Request {
    
}

/************************************/
public abstract class Handler {
    public abstract void handle(Request request);
    protected Handler next;

    public Handler(Handler next) {
        this.next = next;
    }
    
}

/************************************/
public class AntiDoSHandler extends Handler {

    public AntiDoSHandler(Handler next) {
        super(next);
    }

    @Override
    public void handle(Request request) {
        //Anti DoS logic
        next.handle(request);
    }

}

/*******************************************/
public class AuthenticationHandler extends Handler{

    public AuthenticationHandler(Handler next) {
        super(next);
    }

    @Override
    public void handle(Request request) {
        //Authentication logic
        next.handle(request);
    }
    
}

/********************************************/
public class AuthorizationHandler extends Handler{

    public AuthorizationHandler(Handler next) {
        super(next);
    }

    @Override
    public void handle(Request request) {
        //Authorization logic
        next.handle(request);
    }
    
}

/********************************************/
public class WebApp {

    AuthorizationHandler authorizationHandler;
    AuthenticationHandler authenticationHandler;
    AntiDoSHandler antiDoSHandler;

    public WebApp() {

    }

    private void startUp() {
        authorizationHandler = new AuthorizationHandler(null);
        authenticationHandler = new AuthenticationHandler(authorizationHandler);
        antiDoSHandler = new AntiDoSHandler(authenticationHandler);
    }
    public void recieve(Request request){
    antiDoSHandler.handle(request);
    }

}

لفهم أعمق لهذا النموذج يمكنك الإطلاع على مفهوم Midleware في كل من Laravel و Asp.net Core.

رابط السلسة على GitHub

https://github.com/mutasemhajhasan/Design-Patterns

المراجع

Gamma, Erich ; Helm, Richard ; Johnson , Ralph ; Vlissides , John;. (1994). Design Patterns: Elements of Reusable Object-Oriented Software. Hawthorne, New York: Addison-Wesley.