الگویِ طراحیِ Chain of Responsibility (جاوا و کاتلین)

فرض کنید برادرِ شما بهتون بگه برام یه لیوان آب بیار و شما کار داشته باشید ، شما به خواهرتون می‌گید یه لیوان آب دست داداش بده ! خواهرتونم فرضا کار داشت ، به اون یکی خواهرتون میگه یه لیوان آب بده به داداش و خواهر کوچیک تر لیوان آبو بهش میده ، الگویِ Chain of Responsibility هم تقریبا همینه ، Chain به معنی "زنجیر" و Responsibility هم که میشه "وظیفه" ، پس زنجیره ای از وظایف رو داریم ، یک وظیفه به این زنجیره داده میشه و اونقدر بین اعضای زنجیره جا به جا میشه تا به عضوِ مناسب از این زنجیره برسه که بتونه انجامش بده ، ای الگو جزء Behavioralها حساب میشه .

مشکلی که در این الگو حل شده این بوده که در Run-Time مشخص میشه کدوم یک از اعضایِ Chain باید پردازش رو انجام بدن ، یعنی بر اساس ورودی‌ها و ... اعضایِ Chain اون رو هم پاس میدن تا به عضوِ مورد نظر برسه

شِمای کلی قضیه به این صورته :

در واقع Handler بنده اصلی کلاس (interface یا abstract) بوده که در خودش عضوی از جنسِ خودش داره (مثلا یک Linked List می‌مونه) که این طوری زنجیره تشکیل میشه ، کلاس‌های ConcreteHandler پیاده‌سازی Handler هستند ، کدِ قسمت Client رکوئست رو به Handler می‌فرسته تا مورد پردازش قرار بگیره .

صورت مساله

فرض شئ به نام Job داریم ، Job می‌تونه از نوع ضروری یا غیر ضروری باشه ، همین طور می‌تونه سریع یا کند باشه و همین طور آسون یا سخت باشه ، در یک سازمان سه سطح نیرو داریم : سطح حرفه‌ای ، متوسط و تازه‌کار . نیرویِ حرفه‌ای باید کارهای ضروری و کند و سخت رو انجام بده ، نیروی متوسط می‌تونه همه کار‌ها رو انجام بده و نیروی تازه کار فقط باید کار‌های غیرضروری ، سریع و آسون رو انجام بده ، مدل سازی ما این طوری میشه که نیروها همون Handler هستند ، زنجیره‌ای از نیروها رو داریم و بهشون Task می‌دیم ، این Task بین نیرو‌ها میچرخه تا زمانی که به آدم مناسبی وصل بشه ، زمانی که این اتفاق افتاد باید اون نیرو باید به وضعیت در حالِ کار تغییر وضعیت بده تا Job جدیدی نگیره :

https://gist.github.com/sasssass/d9c93b5c23fda6e442f48c93962ead18

و برای استفاده هم یک کلاس Chain درست می‌کنیم که Head زنجیره رو درون خودش داره و با استفاده از اون در کدِ Client پردازش رو انجام می‌دیم :

https://gist.github.com/sasssass/dea38bd262667c7d30265143a15ec6d3

باقی مقالات در مورد الگوی‌های طراحی رو در این مقاله بخونید .

من رو در لینکدین و اینستاگرام دنبال کنید ???

اگه دوست داشتید می‌تونید به صفحه Spotify بنده هم برید و موسیقی های منو گوش بدید ???