Chain Of Responsibility
2020. 5. 2. 17:59ㆍ디자인 패턴
반응형
1. Chain Of Responsibility
Chain Of Responsibility란 요청을 처리할 수 있는 기회를 하나 이상의 객체에 부여함으로써 요청하는 객체와 처리하는 객체 사이의 결합도를 제거하는 패턴입니다. 요청을 해결할 객체를 만날 때까지 객체 고리를 따라서 요청을 전달합니다. 일반적으로 처리할 수 있는 모든 객체들을 고리로 묶고 맨 처음 객체에게 전달하여 처리하지 못하면 다음 객체로 넘기는 방식으로 진행됩니다. 아래를 예제를 통해 어떻게 구현되는지 확인할 수 있습니다.
예제를 보면 숫자를 요청으로 전달했을 때, 객체 고리를 따라서 데이터를 전달합니다.
체인
public interface Chain {
public abstract void setNext(Chain nextInChain);
public abstract void process(int request);
}
Negative Processor
public class NegativeProcessor implements Chain{
private Chain nextInChain;
@Override
public void setNext(Chain nextInChain) {
this.nextInChain = nextInChain;
}
@Override
public void process(int request) {
if(request < 0) {
System.out.println("NegativeProcessor : " + request);
} else {
nextInChain.process(request);
}
}
}
Zero Processor
public class ZeroProcessor implements Chain{
private Chain nextInChain;
@Override
public void setNext(Chain nextInChain) {
this.nextInChain = nextInChain;
}
@Override
public void process(int request) {
if(request == 0) {
System.out.println("ZeroProcessor : " + request);
} else {
nextInChain.process(request);
}
}
}
Positive Processor
public class PositiveProcessor implements Chain{
private Chain nextInChain;
@Override
public void setNext(Chain nextInChain) {
this.nextInChain = nextInChain;
}
@Override
public void process(int request) {
if(request > 0) {
System.out.println("PositiveProcessor : " + request);
} else {
nextInChain.process(request);
}
}
}
Main
public class Main {
public static void main(String[] args) {
Chain c1 = new NegativeProcessor();
Chain c2 = new ZeroProcessor();
Chain c3 = new PositiveProcessor();
c1.setNext(c2);
c2.setNext(c3);
c1.process(90);
}
}
2. Chain Of Responsibility의 특징
- 결합도를 낮추며, 요청의 발신자와 수신자를 분리할 수 있습니다.
- 클라이언트는 처리 객체 집합의 내부 구조를 알 필요가 없습니다.
- 집합 내의 처리 순서를 변경하거나 처리 객체를 추가 또는 삭제할 수 있어 유연성이 향상됩니다.
- 새로운 요청에 대한 처리 객체 생성이 매우 편리합니다.
- 충분한 디버깅을 거치지 않을 경우, 집합 내부에서 사이클이 발생할 수 있습니다.
반응형
'디자인 패턴' 카테고리의 다른 글
Composite Pattern (0) | 2020.07.03 |
---|---|
Factory Pattern (0) | 2020.05.06 |
Observer Pattern (0) | 2020.05.02 |
Template Method Pattern (0) | 2020.05.01 |
Singleton Pattern (0) | 2020.04.27 |