728x90
정의
- 특정 객체에 대한 접근을 제어하거나 기능을 추가할 수 있는 패턴
- 실제 기능을 수행하는 객체 대신 가상의 객체를 사용해 로직의 흐름을 제어하는 패턴
사용하는 용도
- 초기화 지연, 접근제어, 로깅, 캐싱 등 다양하게 응용해서 사용함
- 접근제어 (권한에 따른 접근 차단 / 캐싱 / 지연 로딩)
- 부가기능 추가 (원래 제공하는 기능에 더해서 부가 기능을 수행)
예시
//인터페이스 정의
public interface Subject {
String operation();
}
//인터페이스 상속한 실제 객체
@Slf4j
public class RealSubject implements Subject {
@Override
public String operation() {
log.info("실제 객체 호출");
sleep(1000);
return "data";
}
private void sleep(int millis) {
try {
Thread.sleep(millis);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//가짜 객체 프록시 객체 (캐싱기능 추가)
@Slf4j
public class CacheProxy implements Subject {
private Subject subject;
private String cache;
public CacheProxy(Subject subject) {
this.subject = subject;
}
@Override
public String operation() {
log.info("프록시동작");
if (cache == null) {
cache = subject.operation();
}
return cache;
}
}
//프록시 실행하는 구현체
public class ProxyPatternClient {
private Subject subject;
public ProxyPatternClient(Subject subject) {
this.subject = subject;
}
public void execute() {
subject.operation();
}
}
//실제 객체는 한번호출하고 나머지 두번은 프록시 호출
public class ProxyPatternTest {
@Test
void proxyTest() {
RealSubject realSubject = new RealSubject();
CacheProxy cacheProxy = new CacheProxy(realSubject);
ProxyPatternClient proxyPatternClient = new ProxyPatternClient(cacheProxy);
proxyPatternClient.execute();
proxyPatternClient.execute();
proxyPatternClient.execute();
}
}
특징
- 기존 코드를 변경하지 않고 새로운 기능을 추가할 수 있음
- OCP (개방 폐쇄의 원칙) / SRP (단일책임의 원칙)을 지킬 수 있음
- 기존 코드가 해야하는 일만 유지할 수 있음
- 코드 복잡도가 증가한다는 단점이 생김
'JAVA' 카테고리의 다른 글
[JAVA] 리플렉션 (0) | 2021.12.12 |
---|---|
[JAVA] 데코레이터 패턴 (0) | 2021.12.10 |
[JAVA] ThreadLocal (0) | 2021.12.03 |
[JAVA] 템플릿 메소드 패턴 (0) | 2021.11.29 |
[JAVA] 전략패턴 (0) | 2021.11.29 |