Chain Of Responsibility

GOF Intent:
Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request. Chain the receiving objects and pass the request along the chain until an object handles it.

در اين Pattern درخواست به يک Chain سپرده مي شود و بين اجزاي زنجيره دست به دست مي شود تا بالاخره يکي بتواند درخواست را Process نمايد.

نمونه کد:

public class LoanRequest {
   int amount;

   public LoanRequest(int amount) {
      this.amount = amount;
   }

   public int getAmount(){
      return amount;
   }
}


public abstract class Approver {

   protected Approver successor;

   public void setSuccessor(Approver successor){
      this.successor = successor;
   }

   abstract public void processRequest(LoanRequest request);
}


public class Employee extends Approver{

   public void processRequest(LoanRequest request) {
      if (request.getAmount() <= 1000)
         System.out.println(“Request Approved by Employee!”);
      else if (successor != null)
         successor.processRequest(request);
   }
}

public class Manager extends Approver{

   public void processRequest(LoanRequest request) {
      if (request.getAmount() <= 2000)
         System.out.println(“Request Approved by Manager!”);
      else if (successor != null)
         successor.processRequest(request);
   }
}


public class Director extends Approver{

   public void processRequest(LoanRequest request) {
      if (request.getAmount() <= 3000)
         System.out.println(“Request Approved by Director!”);
      else if (successor != null)
         successor.processRequest(request);
   }
}


public static void main(String[] args){

   Approver a = new Employee();
   Approver b = new Manager();
   Approver c = new Director();

   a.setSuccessor(b);
   b.setSuccessor(c);

   a.processRequest(new LoanRequest(500));
   a.processRequest(new LoanRequest(1500));
   a.processRequest(new LoanRequest(2500));
}

در مثال بالا درخواست هاي وام بسته به مبلغ شان توسط يکي از اجزاي زنجيره تاييد مي گردند.

فايده هاي Chain of Responsibility:

  • باعث کاهش coupling بين sender و receiver مي شود. در اين Pattern فرستنده نمي داند که درخواستش توسط چه کلاسي پردازش مي شود. همچنين گيرنده هم دانش مشخصي درباره فرستنده ندارد.
  • باعث flexibility بيشتر مي شود. شما مي توانيد در زمان اجرا Chain را تغيير دهيد، بنابراين کارها و درخواست هاي قابل انجام در زنجيره بطور ديناميک قابل تغيير است.

نکته:
تضميني نيست که درخواست حتما انجام شود. چون request دريافت کننده مشخص و اختصاصي ندارد. درصورتي که Chain به درستي سازماندهي نشده باشد، ممکن است درخواست اصلا انجام نشود.



منبع ها:

  1. Design Patterns – Elements of Reusable Object Oriented Software (GOF) By Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides
  2. Chain of Responsibility in Devlake
  3. Chain of Responsibility in Wikipedia

پست شده در Design Pattern

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

*


+ 2 = سه

شما می‌توانید از این دستورات HTML استفاده کنید: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

تماس با من: admin@paspars.com