Chain of Responsibility Design [중재자 디자인]

  1. Design Object [디자인목적]

    1. 명령 객체(Command Object) 와 처리 객체(Handling Object)로 구분
    2. 각 처리 객체는 명령 객체 타입을 정의해두며, 처리가 안된 처리 객체들을 다음 처리객체로 전달.
    3. 느슨한 결합을 구현할 때 사용
  2. Options [대안들]

  3. Benefit [디자인 장점]

    1. 객체의 처리와 명령이 구분됨.

    2. 객체간 결합이 느슨해 지므로 유지보수 용

  4. Structure & Sample Code [구조와 샘플코드]

    1) 결제 모듈의 책임연쇄처

    1. UML

    2. 구조
      -> CheckoutHandler 추상클래스 선언 후, 책임처리할 처리객체들을 확장
      -> PaymentCheckoutHandler와 CustomerInfoCheckoutHandler가 처리객체가 됨.
      -> PaymentCheckoutHandler에서 HandleCheckout을 overriding(오버라이딩)하여 처리 후 CustomerInfoCheckoutHandler로 책임 전가.
      -> PaymentCheckoutHandler.setNextHandler에서 CustomerInfoCheckoutHandler를 nextHandler로 정의하므로, 책임이 전가될 수 있
      -> PaymentCheckoutHandler에서 처리가 끝난 뒤, CustomerInfoCheckoutHandler가 처리를 하며, 더이상 책임할 객체가 없으면, 프로그램 종료.

  5. Source code

    1. Client
public class Client {

    public static void main(String[] args) {
        /**
         *  To Testing, start handler and next handler is defined in main(), but these methods
            can be defined in process class.
         */
        // Start Handler
        PaymentCheckoutHandler handler = new PaymentCheckoutHandler();
        // Finish Handler
        CustomerInfoCheckoutHandler customerInfoCheckoutHandler = new CustomerInfoCheckoutHandler();

        // Setting next handler. This part can be implemented in each Handling class
        handler.setNextHandler(customerInfoCheckoutHandler);

        handler.handlCheckout();

    }

}
  • CheckoutHandler<Abstract>
public abstract class CheckoutHandler {
    // Member attribute - nextHandler
    protected CheckoutHandler nextHandler;

    // Handling this responsibility
    public abstract void handlCheckout();

    // Setting next handler
    public void setNextHandler(CheckoutHandler nextHandler) {
        this.nextHandler = nextHandler;
    }
}
  • PaymentCheckoutHandler
public class PaymentCheckoutHandler extends CheckoutHandler{

    @Override
    public void handlCheckout() {
        System.out.println("Hanling payment of the customer");

        // After responsibility handling, send resonsiblity to next Handler
        if(nextHandler != null){
            nextHandler.handlCheckout();
        }
    }
}
  • CustomerInfoCheckoutHandle
public class CustomerInfoCheckoutHandler extends CheckoutHandler{
    @Override
    public void handlCheckout() {
        System.out.println("Adding extra info to checkout of the customer");

        if(nextHandler != null){
            nextHandler.handlCheckout();
        }
    }
}

results matching ""

    No results matching ""