데코레이션 패턴 vs 프록시 패턴
기준 | 데코레이터 패턴 | 프록시 패턴 |
---|---|---|
목적 | 객체에 동적으로 새로운 기능을 추가하기 위함 | 다른 객체에 대한 접근을 제어하거나 부가기능을 제공하기 위함 |
사용 시점 | 실행 시간에 객체의 기능을 확장하고자 할 때 | 객체의 생성이나 접근에 대한 제어가 필요할 때 |
구현 방식 | 추상 클래스나 인터페이스를 사용하여 객체에 새로운 기능을 추가 | 프록시 객체를 통해 실제 객체에 접근, 프록시 객체와 실제 객체는 같은 인터페이스를 구현 |
1.객체들이 사용하는 코드를 훼손하지 않으면서 런타임에 추가 행동들을 객체들에 할당할 때 사용.
ex) 택스트 편집기 - 택스트 편집기에서 굵게, 이텔릭체, 밑줄 등과 같은 다양한 텍스트 포맷을 지원한다. Spring - HttpServletRequestWrapper : Sevlet에서 제공하는 Wrapper로 데코레이터 패턴을 지원한다.
가상 프록시, 지연 로딩이 필요한 경우
보호 프록시, 접근 제어가 필요한 경우
원격 프록시, 원격 서비스의 로컬 실행이 필요한 경우
로깅 프록시, 서비스 객체에 대한 로깅이 필요한 경우
캐싱 프록시, 요청 결과를 캐시하고 생명주기를 관리해야 하는 경우
ex) Spring JAP
public void write(char cbuf[], int off, int len) throws IOException {
synchronized (lock) {
ensureOpen();
if ((off < 0) || (off > cbuf.length) || (len < 0) ||
((off + len) > cbuf.length) || ((off + len) < 0)) {
throw new IndexOutOfBoundsException();
} else if (len == 0) {
return;
}
if (len >= nChars) {
/* If the request length exceeds the size of the output buffer,
flush the buffer and then write the data directly. In this
way buffered streams will cascade harmlessly. */
flushBuffer();
out.write(cbuf, off, len);
return;
}
int b = off, t = off + len;
while (b < t) {
int d = min(nChars - nextChar, t - b);
System.arraycopy(cbuf, b, cb, nextChar, d);
b += d;
nextChar += d;
if (nextChar >= nChars)
flushBuffer();
}
}
}