دیزاین پترن زنجیره - Chain-of-responsibility pattern

ترجمه و تالیف : پشتیبانی راکت
تاریخ انتشار : 13 خرداد 98
خواندن در 42 ثانیه
دسته بندی ها : برنامه نویسی

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

در مدل استاندارد دیزاین پترن زنجیره مسئولیت، بعضی از اعضا ممکن است به عنوان جابجا کننده عمل کنند، یعنی قادر به ارسال دستورات در جهت ها و قسمت های مختلف برنامه می باشند که در نتیجه تشکیل یک درخت از مسئولیت ها را می دهند. در بعضی موارد، این امر می تواند به صورت بازگشتی رخ دهد ، در این مورد، بازگشت تا زمانی ادامه می یابد که فرمان پردازش می شود، یا کل درخت مورد بررسی قرار گرفته است. یک مترجم XML می تواند به این کار کمک شایانی کند و این امر را انجام دهد.

به این ترتیب دیزاین پترن Chain-of-responsibility pattern ایده ی اتصال فرمان ها و پردازش پشت سر هم آنها را در پروژه هایی مختلف به وجود می آورد.

به مثال زیر توجه کنید

دیزاین پترن زنجیره - 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!';
    }
}
گردآوری و تالیف پشتیبانی راکت
آفلاین
user-avatar

باور ما اینست که کاربران ایرانی لایق بهترین‌ها هستند، از این رو ما تمام تلاش خود را می‌کنیم تا بتوانیم فیلم‌ها و مقالات آموزشی بروز و کاربردی را در اختیارتان قرار دهیم تا با استفاده از آنها بتوانید جزء بهترین‌ها در صنعت طراحی و برنامه‌نویسی وب شوید. ما ادعا نمی‌کنیم که بهترین هستیم ولی همیشه تمام تلاش خود را می‌کنیم بهترین عملکرد را به شما ارائه دهیم.

دیدگاه‌ها و پرسش‌ها

برای ارسال نظر لازم است ابتدا وارد سایت شوید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید