소프트웨어 엔지니어링에서 위임 패턴은 객체 지향 디자인 패턴으로, 객체를 구성하여 상속과 동일한 코드 재사용을 달성할 수 있게 해 준다.
위임에서는, 한 객체가 어떤 요청을 처리할 때, 그 요청을 두 번째 객체(위임 대상, delegate
)에게 넘겨서 처리하게 한다. 이때 delegate
는 원래 객체의 문맥을 유지하면서 동작하는 helper
객체이다.
public class ContentCachingRequestWrapper extends HttpServletRequestWrapper {
public ContentCachingRequestWrapper(HttpServletRequest request, int cacheLimit) {
super(request); // 원래 request 객체가 delegate
int contentLength = request.getContentLength();
this.cachedContent = (contentLength > 0 ?
new FastByteArrayOutputStream((cacheLimit > 0 ? Math.min(contentLength, cacheLimit) : contentLength)) :
new FastByteArrayOutputStream());
this.contentCacheLimit = (cacheLimit > 0 ? cacheLimit : null);
}
}
@Override
public String getParameter(String name) {
// 래퍼(wrapper) 객체에서 일부 로직 수행하고
if (this.cachedContent.size() == 0 && isFormPost()) {
writeRequestParametersToCachedContent();
}
return super.getParameter(name); // 나머지는 delegate에게 위임하여 원래 객체의 문맥 유지
}
언어 차원에서 위임을 지원하는 경우, delegate
내부의 self
가 위임 대상(수신 객체)이 아닌 원래 요청을 보낸 객체(전송 객체)를 가리키도록 함으로써 이 작업이 암묵적으로 이루어진다. 반면, 일반적인 위임 패턴에서는 원래 객체를 메서드 인자로 delegate
에 명시적으로 전달함으로써 같은 효과를 얻는다.
이때 위임(delegate
)이라는 용어는 종종 느슨하게 사용되어, 실은 포워딩(forwarding
)이라는 별개의 개념을 가리킬 때 쓰이기도 한다. 포워딩(forwarding
)이란, 요청을 보낸 객체가 단순히 수신 객체의 해당 멤버를 호출하는 것이며, 이를 원래 객체(delegator
)가 아닌 객체(delegate
)의 문맥에서 평가된다.
public class Delegator {
private final Delegate delegate;
private final State state;
public Delegator(Delegate delegate, State state) {
this.delegate = delegate;
this.state = state;
}
public String execute1(String a) {
return delegate.delegate(this, a); // delegate가 위임을 수행하는 과정에서 delegator의 문맥이 필요한 경우
}
public String execute2(String a) {
String b = doSomeThingInDelegator(a); // 필요한 일부 로직 수행
return delegate.forward(b); // 나머지는 delegate에게 위임하여 원래 객체의 문맥 유지
}
}
public class Delegate {
public String delegate(Delegator delegator, String s) {
String r = s;
if(delegator.getState() == GoodState) { // delegator의 문맥을 사용하여 평가
r = doSomThingForGoodState(r);
}
return doSomeThingInDelegate(r); // delegate의 문맥에서 평가
}
public String forward(String s) {
return doSomeThingInDelegate(s); // delegate의 문맥에서 평가
}
}
정의
위임은 상속만큼이나 강력한 재사용 수단으로, 컴포지션을 활용하는 방법이다. 위임에서는 요청을 처리하기 위해 두 개의 객체가 관여하며, 수신 객체(delegator)가 위임자(delegate)에게 작업을 위임한다. 이러한 구조는 서브클래스가 요청을 부모 클래스에게 연기(deferring)하는 방식과 유사하다.
하지만 상속의 경우, 부모 클래스의 메서드(상속된 연산)는 C++의 this나 Smalltalk의 self를 통해 실제 호출한 자식 객체(수신 객체)를 참조할 수 있다. 위임에서 동일한 효과를 얻으려면, 수신 객체가 자신에 대한 참조를 위임자에게 넘겨주어, 위임된 연산이 수신 객체를 참조할 수 있도록 해야 한다.
'자바' 카테고리의 다른 글
Composite Pattern 정리 (0) | 2025.04.18 |
---|---|
Facade Pattern 정리 (0) | 2025.04.17 |
Decorator Pattern 정리 (0) | 2025.04.11 |
Adapter Pattern 정리 (0) | 2025.04.08 |
Class.isAssignableFrom(Class<?> var1) 정리 (0) | 2025.04.07 |