728x90
프록시패턴(proxy pattern) 과 데코레이터패턴(decorator pattern)
😊공통점
둘 다 프록시를 이용한다는 점!
😊프록시란?
'대리' 라는 의미로 프록시에게 어떤 일을 대신 시키는 것
😊프록시의 기능?
• 접근제어 (권한에 따른 접근 차단, 캐싱, 지연로딩) => 프록시패턴 이용
• 부가기능추가 (원래 서버가 제공하는 기능에 더해서 부가기능을 수행) =>데코레이터패턴 이용
ex) 요청값이나 응답값을 중간에 변형한다.
ex) 실행시간을 측정해서 추가 로그를 남긴다.
1. 프록시패턴
😀코드로 알아보기!!
Subject.java
public interface Subject {
void run();
}
RealSubject.java
@Slf4j
public class RealSubject implements Subject{
@Override
public void run() {
log.info("실체객체호출!!");
sleep(1000);
}
private void sleep(int millis){
try {
Thread.sleep(millis);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
ProxySubject.java
@Slf4j
public class ProxySubject implements Subject{
private Subject target;
private String cacheValue;
public ProxySubject(Subject target){
this.target = target;
}
@Override
public void run() {
log.info("프록시 호출!!");
if(cacheValue == null){
cacheValue = "o";
target.run();
log.info("최초 접근으로 판단! 실체 객체에 직접 접근!!");
}
}
}
ProxyPatternTest.java
@Slf4j
public class ProxyPatternTest {
@Test
void test(){
Subject cacheProxy = new ProxySubject(new RealSubject());
cacheProxy.run(); //realSubject 실제객체 호출
cacheProxy.run(); //캐싱기능으로 프록시객체 호출
cacheProxy.run(); //캐싱기능으로 프록시객체 호출
}
결과값
프록시 호출!!
실체객체호출!!
최초 접근으로 판단!
실체 객체에 직접 접근!!
프록시 호출!!
프록시 호출!!
2. 데코레이터패턴
😀코드로 알아보기!!
요구사항 :
비빔밥을 요리할거에요. 소스 추가해주세요.
Bab.java
public interface Bab {
void cook();
}
Bibimbab.java
@Slf4j
public class Bibimbab implements Bab {
@Override
public void cook() {
log.info("기본비빔밥 요리 시작!");
}
}
Decorator.java
public class Decorator implements Bab{
private Bab bab;
public Decorator(Bab bab) {
this.bab = bab;
}
@Override
public void cook() {
bab.cook();
}
}
Source.java
@Slf4j
public class Source extends Decorator{
public Source(Bab bab){
super(bab); //부모클래스 Decorator에 생성자주입!!
}
public void addMaterial(){
log.info("비빔밥에 소스 추가");
}
@Override
public void cook(){
super.cook();
addMaterial();
}
}
DecoratorPatternTest.java
import org.junit.jupiter.api.Test;
@Slf4j
public class DecoratorPatternTest {
@Test
public void codeTest(){
Bab addSourceBibimbab = new Source(new Bibimbab());
}
}
결과값
비빔밥 주문이요!! 요구사항 : 밥추가
기본비빔밥 요리 시작!
비빔밥에 소스 추가
'DESIGN PATTERN' 카테고리의 다른 글
[디자인패턴] 어댑터 패턴(Adapter Pattern)이란? - 개발자 배찌 (0) | 2022.04.11 |
---|---|
[디자인패턴] 책임 연쇄 패턴 (Chai- of-responsibility Pattern) - 개발자 배찌 (0) | 2022.04.11 |
[디자인패턴] 브릿지패턴(Bridge Pattern) 이란? - 개발자 배찌 (0) | 2022.04.07 |
[디자인패턴] 어댑터 패턴 (Adaptor Pattern) 예시 - 개발자 배찌 (0) | 2022.02.03 |
[디자인패턴] 스트래티지 패턴(Strategy Pattern)이란? - 개발자 배찌 (0) | 2022.02.03 |