در برنامه نویسی به صورت شئ گرا، دیزاین پترنی وجود دارد به نام زنجیره مسئولیت که متشکل از یک مخزن شامل اشیاء فرمان و مجموعه ای از اشیاء پردازش است. هر شئ پردازش حاوی منطقی است که انواع اشیاء فرمان را که می تواند آنها را مدیریت کند تعریف می کند. بقیه قسمت های اشیاء خط فرمان به شیء پردازش بعدی در ادامه ی زنجیره منتقل می شوند. همچنین در این دیزاین پترن مکانیسمی نیز برای اضافه کردن اشیاء پردازش جدید به انتهای این زنجیره وجود دارد.
در مدل استاندارد دیزاین پترن زنجیره مسئولیت، بعضی از اعضا ممکن است به عنوان جابجا کننده عمل کنند، یعنی قادر به ارسال دستورات در جهت ها و قسمت های مختلف برنامه می باشند که در نتیجه تشکیل یک درخت از مسئولیت ها را می دهند. در بعضی موارد، این امر می تواند به صورت بازگشتی رخ دهد ، در این مورد، بازگشت تا زمانی ادامه می یابد که فرمان پردازش می شود، یا کل درخت مورد بررسی قرار گرفته است. یک مترجم XML می تواند به این کار کمک شایانی کند و این امر را انجام دهد.
به این ترتیب دیزاین پترن Chain-of-responsibility pattern ایده ی اتصال فرمان ها و پردازش پشت سر هم آنها را در پروژه هایی مختلف به وجود می آورد.
به مثال زیر توجه کنید
UML کد پایین
فایل Handler.php
// Handler.php
namespace DesignPatterns\Behavioral\ChainOfResponsibilities;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
abstract class Handler
{
/**
* @var Handler|null
*/
private $successor = null;
public function __construct(Handler $handler = null)
{
$this->successor = $handler;
}
/**
* This approach by using a template method pattern ensures you that
* each subclass will not forget to call the successor
*
* @param RequestInterface $request
*
* @return string|null
*/
final public function handle(RequestInterface $request)
{
$processed = $this->processing($request);
if ($processed === null) {
// the request has not been processed by this handler => see the next
if ($this->successor !== null) {
$processed = $this->successor->handle($request);
}
}
return $processed;
}
abstract protected function processing(RequestInterface $request);
}
فایل FastStorage.php
// Responsible/FastStorage.php
namespace DesignPatterns\Behavioral\ChainOfResponsibilities\Responsible;
use DesignPatterns\Behavioral\ChainOfResponsibilities\Handler;
use Psr\Http\Message\RequestInterface;
class HttpInMemoryCacheHandler extends Handler
{
/**
* @var array
*/
private $data;
/**
* @param array $data
* @param Handler|null $successor
*/
public function __construct(array $data, Handler $successor = null)
{
parent::__construct($successor);
$this->data = $data;
}
/**
* @param RequestInterface $request
*
* @return string|null
*/
protected function processing(RequestInterface $request)
{
$key = sprintf(
'%s?%s',
$request->getUri()->getPath(),
$request->getUri()->getQuery()
);
if ($request->getMethod() == 'GET' && isset($this->data[$key])) {
return $this->data[$key];
}
return null;
}
}
فایل SlowStorage.php
// Responsible/SlowStorage.php
namespace DesignPatterns\Behavioral\ChainOfResponsibilities\Responsible;
use DesignPatterns\Behavioral\ChainOfResponsibilities\Handler;
use Psr\Http\Message\RequestInterface;
class SlowDatabaseHandler extends Handler
{
/**
* @param RequestInterface $request
*
* @return string|null
*/
protected function processing(RequestInterface $request)
{
// this is a mockup, in production code you would ask a slow (compared to in-memory) DB for the results
return 'Hello World!';
}
}
دیدگاه و پرسش
در حال دریافت نظرات از سرور، لطفا منتظر بمانید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید