الگوی طراحی Chain Of Responsibility
![Chain of Responsibility](https://files.virgool.io/upload/users/6948/posts/putewbvwcs8f/t8eidqdv7kof.png)
فرض کنید می خواهیم گزارشی تهیه کنیم و برای تهیه آن از دو نوع فرمت میتونیم استفاده کنیم: Pdf و Text
یک راه این هست که با شرط If/Else یا Switch بررسی کنیم که کدام فرمت انتخاب شده تا گزارش را بر اساس آن بسازیم
راه بهتری هم وجود داره که آن استفاده از یک الگوی طراحی به نام زنجیره ای از مسئولیت ها
در این الگو شما باید مسئولیت های مورد نیاز را بطور جداگانه ایجاد کنید و هر کدام از آنها را به یک مسئولیت دیگر متصل کنید
در این مثال ما می خواهیم دو تا مسئولیت جداگانه، یکی برای ایجاد گزارش از نوع Pdf و دیگری از نوع Text داشته باشیم
یعنی نوع گزارش را انتخاب می کنیم و به مسئولیت ایجاد کننده اول یعنی Pdf می دهیم و آن بررسی می کند تا نوع انتخاب شده Pdf باشد گزارشی با فرمت Pdf را ایجاد کند در غیر اینصورت آن را به مسئولیت بعدی بدهد.
توجه داشته باشید که ترتیب مسئولیت ها را می توانیم عوض کنیم.
در انتها نیز یک مسئولیت برای ایجاد خطا در نظر می گیریم که اگر فرمت انتخاب شده هیچ کدام از آنها نبود خطا نشان داده شود.
زنجیره مسئولیت های ما بدین صورت است:
Pdf => Text => Error
کلاس ReportFormat انواع فرمت های گزارش را تعیین می کنیم (خط 1)
یک کلاس برای گزارش در نظر می گیریم که برای ساده تر شدن آن فقط عنوان گزارش و نوع گزارش را تعیین می کنیم (خط 6)
کلاس انتزاعی برای مسئولیت هایمان در نظر می گیریم تا مسئولیت ها از آن ارث بری کنند (خط 12)
دو تا مسئولیت Pdf و Text داشتیم به همراه یک مسئولیت دیگر که تولید خطا می کرد (خط 20 تا 40)
دقت داشته باشید توی هر کدام از مسئولیت ها، مسئولیت بعدی را مشخص کرده ایم.
در انتها گزارش را با فرمت Text ایجاد و به هندلر اول (Pdf) می دهیم.