DESIGN PATTERN

[디자인패턴] 프록시패턴(proxy Pattern)과 데코레이터패턴(decorator Pattern) - 개발자 배찌

개발자 배찌 2022. 4. 7. 11:11
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());
}
}


결과값

비빔밥 주문이요!! 요구사항 : 밥추가
기본비빔밥 요리 시작!
비빔밥에 소스 추가