Chain of Responsibility Pattern 책임체인패턴
행동패턴으로, 요청을 받아 수행할 객체들을 엮어내는 패턴입니다. 요청의 타입에 따라, 각 객체가 요청을 수행할 것인지, 다음 객체로 넘겨줄 것인지를 판단합니다.
책임체인 패턴이 적합한 경우
- 요청의 경우의 수에 따라 다른 종류의 작업이 진행되어야 하는 경우, 단 요청의 타입을 정의할 수 있고, 실행 순서를 미리 알 수 없는 경우
- 정의된 순서에 따라 몇개의 작업이 진행되어야만 하는 경우
- 런타임 시점에 작업의 순서나 작업 그룹을 정의해야 하는 경우
장단점
장점
- 요청의 처리 순서를 결정할 수 있습니다.
- 작업을 요청하는 클래스와 작업을 수행하는 클래스를 분리할 수 있습니다. (단일책임원칙)
- 기존의 요청 코드(client code)를 수정하지 않고도 새로운 작업 그룹을 추가할 수 있습니다. (개방폐쇄원칙)
단점
- 몇 개의 요청은 Chain으로 처리할 수 없을 수 있습니다.
Chain of Responsibility Pattern 책임체인패턴 구현
객체를 순차적으로 호출할 객체인 Chain을 생성합니다.
Chain
public class Chain {
Processor chain;
public Chain() {
build();
}
private void build() {
chain = new PositiveProcessor(new ZeroProcessor(new NegativeProcessor(null)));
}
public void process(Integer request){
chain.process(request);
}
}
Processor
public abstract class Processor {
private Processor processor;
public Processor(Processor processor) {
this.processor = processor;
}
public void process(Integer request){
if( ! Objects.isNull(processor)){
processor.process(request);
}
}
}
Negative Processor
public class NegativeProcessor extends Processor {
public NegativeProcessor(Processor processor) {
super(processor);
}
@Override
public void process(Integer request) {
if(request < 0){
System.out.println("request is negative.");
return;
}
super.process(request);
}
}
Zero Processor
public class ZeroProcessor extends Processor {
public ZeroProcessor(Processor processor) {
super(processor);
}
@Override
public void process(Integer request) {
if(request == 0){
System.out.println("request is zero.");
return;
}
super.process(request);
}
}
Positive Processor
public class PositiveProcessor extends Processor {
public PositiveProcessor(Processor processor) {
super(processor);
}
@Override
public void process(Integer request) {
if(request > 0){
System.out.println("request is positive.");
return;
}
super.process(request);
}
}
Main
public class Main {
public static void main(String[] args) {
Chain chain = new Chain();
chain.process(10);
chain.process(0);
chain.process(-10);
}
}
request is positive.
request is zero.
request is negative.
참조
'JAVA > DesignPattern' 카테고리의 다른 글
Design Pattern 디자인 패턴 Iterator Pattern 이터레이터 패턴 (0) | 2021.12.23 |
---|---|
Design Pattern 디자인 패턴 Command Pattern 커맨드 패턴 (0) | 2021.12.22 |
Design Pattern 디자인 패턴 Proxy Pattern 프록시 패턴 (0) | 2021.12.20 |
Design Pattern 디자인 패턴 Flyweight Pattern 플라이웨이트 패턴 (0) | 2021.12.19 |
Design Pattern 디자인 패턴 Facade Pattern 파사드 패턴 (0) | 2021.12.18 |