반응형
Chain of Responsibility Pattern (책임 연쇄 패턴)
목적
Request를 보내는 객체와 받는 객체들 간의 결합도를 없애기 위한 패턴이다. 하나의 Request에 대한 처리가 여러 객체에서 가능하다. 현재 객체에서 처리했거나 혹은 처리하지 못한 request를 다음 객체로 넘김으로써 다른 객체에서 Request를 처리할 수 있는 기회를 준다. 이러한 방식은 링크드 리스트 자료구조와 유사하다. 결론적으로 하나의 Request에대한 여러 처리방식을 유연하게 연결(추가)할 수 있다.
사용 시나리오
- 어떤 API를 사용하기 위해서 인증절차를 거쳐야 한다.
- 인증 요청은 id값과 token값으로 한다.
- 인증과정 절차는 id를 확인하는 과정과 token을 확인하는 과정 총 두가지이다.
[Request]
class AuthRequest {
public:
AuthRequest(string id, string token) : id(id), token(token)
{}
virtual ~AuthRequest() {}
string getId() {return id;}
string getToken() {return token;}
private:
string id;
string token;
};
[Handler]
class AuthHandler {
public:
void setNextAuthHandler(AuthHandler* authHandler) {
this->nextAuthHandler = authHandler;
}
virtual bool handleRequest(AuthRequest* authRequest) = 0;
protected:
AuthHandler* nextAuthHandler;
};
[ConcreteHandler]
class IDAuthHandler : public AuthHandler {
public:
virtual bool handleRequest(AuthRequest* authRequest) override {
if(checkIDAuth(authRequest->getId())) {
cout<<"ID authentication succeed"<<endl;
if(nextAuthHandler != nullptr)
return nextAuthHandler->handleRequest(authRequest);
else
return true;
}
else
return false;
}
private:
bool checkIDAuth(string id) {
return true;
}
};
class TokenAuthHandler : public AuthHandler {
public:
virtual bool handleRequest(AuthRequest* authRequest) override {
if(checkTokenAuth(authRequest->getToken())) {
cout<<"Token authentication succeed"<<endl;
if(nextAuthHandler != nullptr)
return nextAuthHandler->handleRequest(authRequest);
else
return true;
}
else
return false;
}
private:
bool checkTokenAuth(string id) {
return true;
}
};
[Client]
int main(int argc, const char * argv[]) {
AuthRequest* authRequest = new AuthRequest("testID", "testToken");
IDAuthHandler* idAuthHandler = new IDAuthHandler();
TokenAuthHandler* tokenAuthHandler = new TokenAuthHandler();
idAuthHandler->setNextAuthHandler(tokenAuthHandler);
idAuthHandler->handleRequest(authRequest);
delete authRequest;
delete tokenAuthHandler;
delete idAuthHandler;
return 0;
}
실행결과
ID authentication succeed
Token authentication succeed
반응형
'Design Patterns > Behavioral Patterns' 카테고리의 다른 글
Mediator Pattern (C++) (0) | 2019.12.29 |
---|---|
Command Pattern (C++) (0) | 2019.12.22 |
Behavior Pattern (행동 패턴) (0) | 2019.12.15 |
Template Method Pattern (C++) (0) | 2019.08.04 |
Strategy Pattern (C++) (0) | 2019.07.07 |