Chain of Responsibility Design [중재자 디자인]
Design Object [디자인목적]
- 명령 객체(Command Object) 와 처리 객체(Handling Object)로 구분
- 각 처리 객체는 명령 객체 타입을 정의해두며, 처리가 안된 처리 객체들을 다음 처리객체로 전달.
- 느슨한 결합을 구현할 때 사용
Options [대안들]
Benefit [디자인 장점]
객체의 처리와 명령이 구분됨.
객체간 결합이 느슨해 지므로 유지보수 용
Structure & Sample Code [구조와 샘플코드]
1) 결제 모듈의 책임연쇄처
UML
구조
-> CheckoutHandler 추상클래스 선언 후, 책임처리할 처리객체들을 확장
-> PaymentCheckoutHandler와 CustomerInfoCheckoutHandler가 처리객체가 됨.
-> PaymentCheckoutHandler에서 HandleCheckout을 overriding(오버라이딩)하여 처리 후 CustomerInfoCheckoutHandler로 책임 전가.
-> PaymentCheckoutHandler.setNextHandler에서 CustomerInfoCheckoutHandler를 nextHandler로 정의하므로, 책임이 전가될 수 있
-> PaymentCheckoutHandler에서 처리가 끝난 뒤, CustomerInfoCheckoutHandler가 처리를 하며, 더이상 책임할 객체가 없으면, 프로그램 종료.
Source code
- 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();
}
}
}