프록시로 DecoratorPattern 만들어보기

Kim Dong Kyun·2023년 4월 11일
1
post-custom-banner

참고한 블로그 링크!

순수 자바 코드로 만들어보기

선생님의 블로그에서 가져온 설명.


내가 직접 작성한 부분

  1. 인터페이스

public interface TargetInterface {
    void run();
}

Proxy와 실체 구현체인 Target 모두의 추상이 되는 인터페이스.
간단한 추상매서드인 run()을 선언

  1. 구현체
public class TargetImpl implements TargetInterface {
    @Override
    public void run() {
        System.out.println("I'm running");
    }
}

추상 매서드의 구현체인 TargetImpl. 실제의 경우, 프록시패턴으로 감싸려고 하는 실 객체가 될것이다.

  1. 프록시
public class Proxy implements TargetInterface{
    private final TargetInterface target;

    public Proxy(TargetInterface target) {
        this.target = target;
    }

    @Override
    public void run() {
        System.out.println("Intercept start!");
        target.run();
        System.out.println("Intercept end!");
    }
}

패턴을 감싸는 프록시.

  • 상위 인터페이스(추상)을 필드에서 선언한다
  • 생성자를 매서드를 선언한다.
  • 추상이 구현한 추상매서드를 구현한다. 구현하는 로직에는 비즈니스 로직이 아닌 다른 구현체에서 구현한 비즈니스 매서드를 하기 전 후에 처리할 과정들을 선언한다.
  1. 구현체2, 호출부
public class Client {
    private TargetInterface targetInterface;
    
    public Client(TargetInterface targetInterface) {
        this.targetInterface = targetInterface;
    }
    public void execute(){
        targetInterface.run();
    }
}

타겟인터페이스를 호출하는 execute() 매서드를 정의한 구현체를 하나 더 만든다.


5. 실험

public class DecoratorPattern {
    static void noDecoratorPattern(){
        TargetInterface targetInterface = new TargetImpl();
        Client client = new Client(targetInterface);
        client.execute();
    }

    static void decoratorPattern(){
        TargetInterface target = new TargetImpl();
        TargetInterface proxy = new Proxy(target);
        Client client = new Client(proxy);
        client.execute();
    }

    public static void main(String[] args) {
        noDecoratorPattern();
        System.out.println("=========================");
        decoratorPattern();
    }
}

각각의 역할을 하는 인스턴스들을 생성 한 후, 정의한 매서드를 실행해 본다.

결과는 다음과 같다.

의도한대로, 그리고 Spring에서 써보았던 AOP 프록시의 느낌으로(@Around) 사용 가능하다.

post-custom-banner

0개의 댓글