Thứ Ba, 14 tháng 5, 2013

Chain of Responsibility

1. Khái niệm

Chain of Responsibility pattern mô tả một yêu cầu (request) được thực hiện lần lượt bởi một chuỗi các đối tượng. Một request sẽ lần lượt được xử lý bởi đối tưởng này và sau đó được truyền cho đối tượng khác để xử lý và cứ thế tiếp tục cho đến đối tượng cuối cùng.

2. Vấn đề thực tế

Trong thực tế, ắt hẳn không ít lần chúng ta phải đối diện với những bài toán về kiểm tra các điều kiện của một phép tính hay một sự việc nào đó. Giả sử chúng ta bước vào sân bay, chúng ta sẽ phải bước qua cổng có bảo vệ để kiểm tra sơ bộ bên ngoài, sau đó sẽ đến phần kiểm tra về giấy tờ, sau đó sẽ kiểm tra về hành lý, rồi kiểm tra về các vật dụng cá nhân mang trong người...Làm thế nào để hiện thực vấn đề trên trong lập trình?

3. Giải pháp

Chain of Responsibility pattern sẽ giúp chúng ta giải quyết vấn đề trên.

Đầu tiên, chúng ta cần có một abstract class có tên Validation để đại diện cho một tập các class cần thực hiện chức năng kiểm tra. Trong Validation sẽ có 2 function chính là validate (dạng trừu tượng) và validChain (dạng implement). Trong validChain(), chúng ta có thể gọi lại hàm validate() và thực hiện việc validChain cho một đối tượng thuộc họ Validation để tiếp tục việc validate của nó. Cứ thế tiếp diễn cho đến các đối tượng kết tiếp vẫn thực thi validChain().

4. Mô hình


5. Code sample

public abstract class Validation {
    private Validation valid = null;
    
    public void setNextValidation(Validation v){
        valid = v;
    }
    
    public void validChain(){
        validate();
        
        if (valid!=null){
            valid.validChain();
        }
    }
    
    public abstract void validate();
    
}



public class OutBoundValidation extends Validation{

    @Override
    public void validate() {
        System.out.println("1: OutBound Validation");
    }
    
}



public class CheckInValidation extends Validation {

    @Override
    public void validate() {
        System.out.println("2: CheckIn Validation");
    }
    
}



public class LuggageValidation extends Validation{

    @Override
    public void validate() {
        System.out.println("3: Luggage Validation");
    }
    
}



public class PersonalValidation extends Validation{

    @Override
    public void validate() {
        System.out.println("4: Personal Validation");
    }
    
}



public class ChORPattern {
    public static void main(String[] args){
        OutBoundValidation first = new OutBoundValidation();
        CheckInValidation second = new CheckInValidation();
        LuggageValidation third = new LuggageValidation();
        PersonalValidation fourth = new PersonalValidation();
        
        first.setNextValidation(second);
        second.setNextValidation(third);
        third.setNextValidation(fourth);
        
        first.validChain();
    }
}

6. Mối quan hệ với các pattern khác

Không có nhận xét nào:

Đăng nhận xét