책임 연쇄 패턴 (Chain of Responsibility)
책임 연쇄 패턴(Chain of Responsibility Pattern)은 클라이언트의 요청을 처리할 수 있는 여러 객체들을 하나의 사슬(Chain)로 연결해 두고, 자신이 처리할 수 없으면 다음 객체로 요청을 떠넘기는 행위 패턴입니다.
회사에서 결재를 올릴 때, 100만 원짜리 기안은 '팀장'이 바로 승인하지만, 1000만 원짜리 기안은 팀장이 처리할 권한이 없으므로 '본부장'에게 결재를 넘깁니다. 본부장도 안되면 '사장'에게 넘어가는 다단계 처리 구조를 `if-else` 중첩 없이 유연하게 만들 수 있습니다.
abstract class Approver {
protected Approver next;
public void setNext(Approver next) {
this.next = next;
}
public abstract void processRequest(int amount);
}
class Manager extends Approver {
public void processRequest(int amount) {
if (amount <= 1000) {
System.out.println("매니저가 " + amount + "원 결재 완료");
} else if (next != null) {
next.processRequest(amount);
}
}
}
class Director extends Approver {
public void processRequest(int amount) {
if (amount <= 5000) {
System.out.println("디렉터가 " + amount + "원 결재 완료");
} else if (next != null) {
next.processRequest(amount);
}
}
}
class CEO extends Approver {
public void processRequest(int amount) {
System.out.println("CEO가 " + amount + "원 결재 완료");
}
}
public class Main {
public static void main(String[] args) {
Approver manager = new Manager();
Approver director = new Director();
Approver ceo = new CEO();
manager.setNext(director);
director.setNext(ceo);
manager.processRequest(500); // 매니저
manager.processRequest(3000); // 디렉터
manager.processRequest(10000); // CEO
}
}