معرفی الگوی طراحی Chain of Responsibility

معرفی الگوی طراحی Chain of Responsibility

مدت مطالعه : 3 دقیقه

15 اردیبهشت 1402

الگوهای طراحی راه حل های اثبات شده ای برای مشکلات طراحی نرم‌افزار هستند. آنها به بهبود کیفیت کد، ارتقای قابلیت استفاده مجدد و افزایش قابلیت نگهداری کمک می کنند. ما از آنها برای صرفه‌جویی در زمان و تولید کد های با کیفیت، توسعه‌پذیر و انعطاف‌پذیر استفاده می‌کنیم. در این مطلب قصد داریم الگوی طراحی Chain of Responsibility را معرفی کنیم.

الگوی زنجیره مسئولیت یا Chain of Responsibility یک الگوی طراحی رفتاری(Behavioral) است که یک شی را قادر می سازد تا درخواستی را در امتداد زنجیره ای از Handler ها ارسال کند تا زمانی که یکی از آنها آن را رسیدگی کند. معمولاً در سیستم‌هایی استفاده می‌شود که در آن چندین شی می‌توانند یک درخواست واحد را مدیریت کنند و سیستم باید تعیین کند که کدام شی باید به صورت پویا درخواست را رسیدگی کند.

 

الگوی Chain of Responsibility از اجزاء زیر تشکیل شده است:

  • Handler: یک کلاس پایه انتزاعی است که کلیات رسیدگی به درخواست ها تعریف می کند.
  • ConcreteHandler: این کلاس یک پیاده سازی مشخص از کلاس Handler است که درخواست هایی را که مسئول آن است رسیدگی می کند.
  • Client: شیئی است که درخواست را ایجاد کرده و به اولین handler در زنجیره ارسال می کند.

 

در ادامه یک مثال از الگوی Chain of Responsibility در C# آمده است:

 

public abstract class SupportHandler
{
    protected SupportHandler _nextHandler;
    public SupportHandler SetNextHandler(SupportHandler handler)
    {
        _nextHandler = handler;
        return handler;
    }
    public abstract string HandleRequest(int request);
}
public class TechnicalSupportHandler : SupportHandler
{
    public override string HandleRequest(int request)
    {
        if (request <= 100)
        {
            return "Technical support can handle this request.";
        }
        else
        {
            return _nextHandler.HandleRequest(request);
        }
    }
}
public class SalesSupportHandler : SupportHandler
{
    public override string HandleRequest(int request)
    {
        if (request <= 200)
        {
            return "Sales support can handle this request.";
        }
        else
        {
            return _nextHandler.HandleRequest(request);
        }
    }
}
public class GeneralSupportHandler : SupportHandler
{
    public override string HandleRequest(int request)
    {
        return "General support can handle this request.";
    }
}

در این مثال کلاس SupportHandler کلاس پایه انتزاعی است که متدی را برای رسیدگی به درخواست ها تعریف می کند. همچنین حاوی اشاره ای به کنترل کننده(Handler) بعدی در زنجیره است.

کلاس های TechnicalSupportHandler، SalesSupportHandler و GeneralSupportHandler پیاده سازی های مشخص کلاس SupportHandler هستند که به درخواست های مخصوص خودشان رسیدگی می‌کنند.

در متد HandleRequest هر یک از Handler ها، بررسی می کند که آیا می تواند درخواست را انجام دهد یا خیر. اگر بتواند، درخواست را رسیدگی می کند و پاسخی را برمی گرداند. در غیر این صورت، با فراخوانی متد HandleRequest مربوط به کنترل کننده بعدی، درخواست را به کنترل کننده بعدی در زنجیره ارسال می کند.

الگوی Chain of Responsibility رویکردی انعطاف‌پذیر برای ارسال درخواست‌ها در امتداد زنجیره‌ای از Handler ها فراهم می‌کند.  این الگو به طور گسترده در سیستم هایی که در آن چندین شی می توانند یک درخواست را رسیدگی کنند استفاده می شود.

اگر از فریمورک های تحت وب نظیر Asp.Net، Laravel یا Express استفاده کرده باشید، حتما با میان‌افزار ها یا Middleware ها آشنا هستید. Middleware ها یک پیاده سازی از الگوی Chain Of Responsibility هستند که یک درخواست وارد شده به سیستم را مرحله به مرحله مدیریت کرده و به آن رسیدگی می‌کنند.

برای مطالعه سایر الگو های طراحی، میتوانید از لیست زیر استفاده کنید. همچنین یک مخزن کد در گیت هاب که شامل همه‌ی الگو های طراحی می‌شود، برای شما قرار گرفته است.

design patterns

ایجاد کننده (Creational):الگوی طراحی Factory 
الگوی طراحی Builder 
الگوی طراحی Singleton 
الگوی طراحی Prototype 
الگوی طراحی Abstract Factory 
ساختاری (Structural):الگوی طراحی Adapter 
الگوی طراحی Bridge 
الگوی طراحی Composite 
الگوی طراحی Decorator 
الگوی طراحی Facade 
الگوی طراحی Flyweight 
الگوی طراحی Proxy 
رفتاری (Behavioral):الگوی طراحی Chain of Responsibility 
الگوی طراحی Command 
الگوی طراحی Interpreter 
الگوی طراحی Mediator 
الگوی طراحی Memento 
الگوی طراحی Observer 
الگوی طراحی State 
الگوی طراحی Strategy 
الگوی طراحی Template Method 
الگوی طراحی Visitor 
الگوی طراحی Iterator 
  • اشتراک گذاری:
محمدرضا باباخانی
محمدرضا باباخانی

من محمدرضا باباخانی هستم، توسعه دهنده نرم افزار. در اینجا تجربیات، نظرات و پیشنهادات خودم رو درباره تکنولوژی مینویسم. امیدوارم مطالبی که می‌نویسم بدردتون بخوره.

آخرین مطالب

سرویس مش؛ ساده سازی ارتباطات میکروسرویس و افزایش رؤیت پذیری

در چشم انداز همیشه در حال تحول توسعه نرم افزار، معماری میکروسرویس ها به دلیل مقیاس پذیری، انعطاف پذیری و توسعه پذیری محبوبیت قابل توجهی به دست آورده است. با این حال، با افزایش تعداد میکروسرویس ها در یک برنامه، مدیریت ارتباطات آنها و اطمینان از رؤیت صحیح همه آنها به طور فزاینده ای چالش برانگیز می شود. اینجاست که سرویس مش وارد عمل می شود.

اهمیت محاسبات لبه یا Edge Computing

ا توجه به سرعت تحول فناوری، یکی از مفاهیمی که توجه زیادی را به خود جلب کرده و نحوه تعامل ما با سیستم های دیجیتال را تغییر می دهد، محاسبات لبه (Edge Computing) است.

معماری رویداد محور چیست؟

معماری رویداد محور (EDA) یک الگوی طراحی نرم افزار است که در توسعه نرم افزار های مدرن به طور چشمگیری محبوب شده است. در این معماری، جریان داده ها با وقوع رویدادها تعیین می شود. بر خلاف سیستم های متمرکز سنتی که دائماً در حال بررسی وضعیت جدید هستند. معماری رویداد محور به ویژه برای سیستم هایی مفید است که به پردازش حجم زیادی از داده ها بصورت بلادرنگ(real-time) نیاز دارند.

ثبت دیدگاه