Multiple Chain of Responsibility
2021, Sep 09
역학 사슬 패턴
- 체인에 묶인 객체들끼리 순서대로 책임을 넘기는 구조
AS-IS.
- 하나의 서비스에서 접수 처리와 메시지 전송 기능이 혼재
TO-BE.
- 접수 처리 프로세스와 메시지 전송 프로세스를 별개로 분리
- 프로세스 순서를 체인으로 강제 ( 접수 프로세스 진행 후 → 메시지 전송 프로세스 진행)
- 3개 이상의 프로세스 순서를 체인으로 강제하는 것 추가
:: Client
// 우선순위 talkInitProcessor -> talkAcceptProcessor -> talkJoinForceProcessor -> messageProcessor
public void message(ConversationMessage conversationMessage) {
talkInitProcessor
.setNext(talkAcceptProcessor);
talkAcceptProcessor
.setNext(talkJoinForceProcessor);
talkJoinForceProcessor
.setNext(messageProcessor);
talkInitProcessor.support(conversationThirdPartyMessage);
}
:: Handler Processor
@Slf4j
public abstract class BtalkProcessor {
private BtalkProcessor next = null;
public BtalkProcessor setNext(BtalkProcessor next) {
this.next = next;
return next;
}
public final void support(ConversationMessage conversationMessage) {
if (process(conversationMessage)) {
action(conversationMessage);
} else if (next != null) {
next.support(conversationMessage);
} else {
log.error("There is no next process of btalk.");
}
}
public abstract boolean process(ConversationMessage conversationMessage);
public abstract void action(ConversationMessage conversationMessage);
}
:: Sub Processor
[talkInitProcessor]
public class TalkInitProcessor extends BtalkProcessor {
@Override
public boolean process(ConversationMessage conversationMessage) {
return isPresent(conversationMessage);
}
@Override
public void action(ConversationMessage conversationMessage) {
sendMessage(conversationMessage);
}
}
[talkAcceptProcessor]
public class TalkAcceptProcessor extends BtalkProcessor {
@Override
public boolean process(ConversationMessage conversationMessage) {
return !isPresent(conversationMessage);
}
@Override
public void action(ConversationMessage conversationMessage) {
reception(conversationMessage);
}
}
참고.
https://lktprogrammer.tistory.com/45