책임을 다른 객체에 전달해가는 패턴
1. 코드
Check: 각각의 책임을 가질 클래스들의 부모 클래스
- next : 다음 책임 객체
public abstract class Check {
private String name;
private Check next;
public Check(String name) {
this.name = name;
}
public Check setNext(Check next) {
this.next = next;
return next;
}
public final void validCheck(int num) {
if (!isValid(num)) {
System.out.println(num + ":" + name +"에서 오류 발생");
return;
}
if (next == null) {
System.out.println("모든 검사가 완료되었습니다.");
} else {
next.validCheck(num);
}
}
protected abstract boolean isValid(int num);
}
LimitCheck : 책임 클래스1 (limit 보다 작은지 검사)
public class LimitCheck extends Check {
private int limit;
public LimitCheck(String name, int limit) {
super(name);
this.limit = limit;
}
@Override
protected boolean isValid(int num) {
return num <= limit;
}
}
NotAllowNunCheck: 책임 클래스2 (특정 값인지 아닌지 검사)
public class NotAllowNumCheck extends Check {
private int notAllowNum;
public NotAllowNumCheck(String name, int notAllowNum) {
super(name);
this.notAllowNum = notAllowNum;
}
@Override
protected boolean isValid(int num) {
return num != notAllowNum;
}
}
OddCheck : 책임 클래스3 (홀수인지 검사)
public class OddCheck extends Check {
public OddCheck(String name) {
super(name);
}
@Override
protected boolean isValid(int num) {
return num % 2 == 1;
}
}
Main: 테스트 클래스
public class Main {
public static void main(String[] args) {
Check limit20 = new LimitCheck("limit20", 20);
Check odd = new OddCheck("odd");
Check notAllow11 = new NotAllowNumCheck("notAllow11", 11);
odd.setNext(limit20).setNext(notAllow11); // 책임을 연결하는 부분
for (int i=1;i<=23;i++) {
odd.validCheck(i);
}
}
}
2. 특징
- 처리를 요청하는 부분과 처리를 수행하는 부분이 분리되어 있다.
- 책임을 연결하는 부분을 동적으로 처리할 수 있다.
- 책임 떠넘기기를 조건문으로 처리한 경우에서는 동적 처리가 힘들다.
3. 해당 패턴을 고려해볼만한 상황
- 순차적으로 조건을 확인하는 로직이 필요하고 그 로직이 동적으로 달라질 가능성이 있을 때
'디자인 패턴 > Java언어로 배우는 디자인패턴 입문 책 정리' 카테고리의 다른 글
Mediator 패턴 (0) | 2021.02.14 |
---|---|
Facade 패턴 (0) | 2021.02.12 |
Visitor 패턴 (0) | 2021.02.07 |
Decorator 패턴 (0) | 2021.01.30 |
Composite 패턴 (0) | 2021.01.24 |