الگوی طراحی Chain Of Responsibility

Chain of Responsibility
Chain of Responsibility


فرض کنید می خواهیم گزارشی تهیه کنیم و برای تهیه آن از دو نوع فرمت میتونیم استفاده کنیم: Pdf و Text

یک راه این هست که با شرط If/Else یا Switch بررسی کنیم که کدام فرمت انتخاب شده تا گزارش را بر اساس آن بسازیم

راه بهتری هم وجود داره که آن استفاده از یک الگوی طراحی به نام زنجیره ای از مسئولیت ها

در این الگو شما باید مسئولیت های مورد نیاز را بطور جداگانه ایجاد کنید و هر کدام از آنها را به یک مسئولیت دیگر متصل کنید

در این مثال ما می خواهیم دو تا مسئولیت جداگانه، یکی برای ایجاد گزارش از نوع Pdf و دیگری از نوع Text داشته باشیم

یعنی نوع گزارش را انتخاب می کنیم و به مسئولیت ایجاد کننده اول یعنی Pdf می دهیم و آن بررسی می کند تا نوع انتخاب شده Pdf باشد گزارشی با فرمت Pdf را ایجاد کند در غیر اینصورت آن را به مسئولیت بعدی بدهد.

توجه داشته باشید که ترتیب مسئولیت ها را می توانیم عوض کنیم.

در انتها نیز یک مسئولیت برای ایجاد خطا در نظر می گیریم که اگر فرمت انتخاب شده هیچ کدام از آنها نبود خطا نشان داده شود.

زنجیره مسئولیت های ما بدین صورت است:

Pdf => Text => Error

https://gist.github.com/farhadmpr/fc7305d9997657f7168ac3b32c289046


کلاس ReportFormat انواع فرمت های گزارش را تعیین می کنیم (خط 1)

یک کلاس برای گزارش در نظر می گیریم که برای ساده تر شدن آن فقط عنوان گزارش و نوع گزارش را تعیین می کنیم (خط 6)

کلاس انتزاعی برای مسئولیت هایمان در نظر می گیریم تا مسئولیت ها از آن ارث بری کنند (خط 12)

دو تا مسئولیت Pdf و Text داشتیم به همراه یک مسئولیت دیگر که تولید خطا می کرد (خط 20 تا 40)

دقت داشته باشید توی هر کدام از مسئولیت ها، مسئولیت بعدی را مشخص کرده ایم.

در انتها گزارش را با فرمت Text ایجاد و به هندلر اول (Pdf) می دهیم.