خانه > الگوهای طراحی, شي گرايي, طراحي > الگوی زنجیره مسئولیت (Chain of Responsibility pattern)

الگوی زنجیره مسئولیت (Chain of Responsibility pattern)

یک سرویس دهنده اینترنتی را در نظر بگیرید. این شرکت دارای سه سطح پشتیبانی به شرح زیر برای کاربران است:

سطح ۱: در این سطح به مشکلات ابتدایی کاربران مانند فراموش کردن کلمه عبور کاربران و … رسیدگی می شود.

سطح ۲: اگر اعضای گروه سطح ۱ نتوانند مشکل مورد نظر را حل کنند. مشکل برای حل به گروه سطح ۲ ارجاع داده می شود.

سطح ۳: اگر اعضای گروه ۲ نیز نتوانند مشکل مورد نظر را حل کنند.مشکل برای حل به گروه سطح ۳ ارجاع داده می شود. در این سطح برای حل مشکل یک قرار ملاقات در محل مشکل با مشتری گذاشته می شود.

همانطوریکه در مثال بالا مشخص است. ممکن است هر کدام از گروه ها به در خواست ارائه شده پاسخ دهند. ولی دقیقا مشخص نیست کدام گروه به در خواست ارائه شده پاسخ خواهد داد. اما همه گروه ها باید شانس این را داشته باشند که به درخواست ارائه شده پاسخ دهند. این شانس اولویت دار است. برای نمونه در مثال بالا ابتدا به تیم سطح ۱ این شانس داده می شود تا مشکل را حل کند. در صور ت عدم حل مشکل به ترتیب، شانس به تیمهای ۲ و ۳ داده می شود. این امکان نیز وجود دارد که هیچ یک از تیم ها نتوانند این مشکل را حل کنند و درخواست ارائه شده بدون پاسخ بماند.

مثالی که در بالا ارائه شده تقریبا تعریفی از الگوی Chain of responsibility (زنجیره مسئولیت) می باشد.

در این الگو به یک شی اجازه داده می شود در خواستی را ارسال کند بدون اینکه بداند کدام شی یا اشیاء آنرا دریافت خواهند کرد و به آن پاسخ خواهند داد. این کار با ارسال درخواست به زنجیره ای از اشیاء صورت می گیرد. هر شی در این زنجیره می تواند به درخواست ارائه شده پاسخ دهد یا آن را به شی بعدی در زنجیره ارسال کند. در واقع هر شی در زنجیره بعنوان یک پاسخگو برای درخواست ارائه شده عمل می کند . اگر شی مورد نظر بتواند درخواست راجواب دهد، پاسخ آن را می دهددر غیر اینصورت آن را به شی جانشین اش (شی بعدی در زنجیره) ارسال می کند.

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

سطوح مدیریت

مبلغ سفارش

مدیر نمایندگی

۲۵۰۰۰

مدیر ناحیه

۱۰۰۰۰۰

نایب‌ رئیس‌

۲۰۰۰۰۰

رئیس‌

۴۰۰۰۰۰

 

شما برای اینکار چه الگوی را پیشنهاد می کنید؟

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

سپس یک کلاس انتزاعی به نام مدیریت سفارش تعریف می کنیم که دارای یک اینترفیس مشترک برای هر کدام از سطوح مدیریت است. که نمودار کلاس  مربوط به مدیریت سفارش و سطوح مدیریت به صورت زیر خواهد بود. که متد تعیین شی جانشین (SetSuccessor)، برای مشخص کردن شی بعدی (شی جانشین) در زنجیره عمل می کند.

برای تائید یک سفارش، کارهای زیر صورت خواهد گرفت:

۱٫    ایجاد یک مجموعه از اشیای که می توانند به درخواست های رسیده شده پاسخ بدهند (سطوح مدیریت). و قرار دادن آنها در یک زنجیره به طور مرتب بر حسب مقادیری که می توانند تائید کنند. هر یک از این اشیاء توسط متد SetSuccessor به شی بعدی متصل می شود.(کلاس Main)

۲٫       یک درخواست تائید به اولین شی موجود در زنجیره ارسال می شود که این کار توسط فراخوانی متد   authorize  آن شی انجام می شود. اگر مبلغ سفارش از مقدار مبلغی که ان شی نی تواند تائید کند کوچکتر باشد، آنرا تائید می کند در غیر اینصورت آن درخواست را به شی بعدی در زنجیره ارسال می کند. (برای مثال در کد زیر می توانید کلاس BranchManager را بررسی کنید. ) 

کلاس مدیریت سفارش

abstract class RHandler

    {                                     

        protected RHandler successor;

 

        public void SetSuccessor(RHandler successor)

        {

            //تعیین شی جانشین

            this.successor = successor;

        }

 

        public abstract void authorize (PurchaseRequest purchase);

    }

کلاس مدیر نمایندگی

 

class BranchManager: RHandler
{

 public override void authorize (PurchaseRequest purchase)
{
   // تائید سفارش

      if (purchase.Amount <=25000)
{

       

      }
else if (successor != null)
{
successor.ProcessRequest(
RegionalDirector);
}
}
}

کلاس Main

class MainApp

    {

        static void Main()

        {

            BranchManager A = new BranchManager();

            RegionalDirector B = new RegionalDirector();

            VicePresident C = new VicePresident();

            President D = new President();

            A.SetSuccessor(B);

            B.SetSuccessor(C);

            C.SetSuccessor(D);

 

            Purchase p = new Purchase( 1, “Order 1″,15000);

            A.authorize(p);

 

            Purchase p = new Purchase( 2, “Order 2″,110000);

            A.authorize(p);

        }

    }

 

 

 

دیاگرام کلاس الگو:

  1. مسعود
    ۶ اسفند ۱۳۸۵ در ۰۸:۳۴ | #1

    وبلاگ بسیار مفیدی است که در نوع خود کم نظیر است.موفق باشید.

  2. مهرداد
    ۱۰ اسفند ۱۳۸۵ در ۱۸:۳۱ | #2

    سلام دست مریزاد. خسته نباشید. مطالب جالب و آموزنده‏ای است.

  3. ۲۵ اسفند ۱۳۸۵ در ۰۱:۵۹ | #3

    با سلام و احترامبا تبریک به خاطر داشتن سایت خوبتانلطفا لینک سایت زیر را که به بررسی مهندسی صنایع و نرم افزار و مقالات دروس آن می پردازد را در سایت خود قرار دهید.با تشکرسایت مهندسی صنایع – بتساhttp://www.betsa.ir

  4. حسین
    ۲۹ اسفند ۱۳۸۵ در ۱۴:۱۲ | #4

    خسته نباشید کارت عالیه ، امیدوارم همینطور ادامه بدی.Factory Pattern قسمت دومشو نگفتی ؟؟؟

  5. شکیلا
    ۷ فروردین ۱۳۸۶ در ۱۴:۰۲ | #5

    با عرض سلام وبلاگ بسیار مفیدی داریدموفق باشیدبای

  1. بدون بازتاب