- 프록시와 리얼 서브젝트는 똑같은 인터페이스를 구현한다.
- 프록시는 리얼 서브젝트를 참조한다.
- 클라이언트는 공유 인터페이스 타입으로 사실상 프록시를 사용한다.
프록시가 클라이언트의 요청을 자신이 처리할 수 있으면 자신이 처리
하지만 여의치 않다면 리얼 서브젝트에게 양도한다.
즉!
-
프록시와 리얼 서브젝트가 공유하는 인터페이스가 있고, 클라이언트는 해당 인터페이스 타입으로 프록시를 사용한다.
-
클라이언트는 프록시를 거쳐서 리얼 서브젝트를 사용하기 때문에 프록시는 리얼 서브젝트에 대한 접근을 관리하거나 부가기능을 제공하거나, 리턴 값을 변경할 수도 있다.
-
리얼 서브젠트는 자신이 해야 할 일만 하면서(SRP) 프록시를 사용해서 부가적인 기능(접근 제한, 로깅, 트랜잭션, 등)을 제공할 때 이런 패턴을 주로 사용한다.
코드 작성
BookService - 인터페이스(서브젝트)
BookServiceProxy - 프록시
DefaultBookService - 리얼 서브젝트
- BookService
public interface BookService {
public void run(Book book);
}
- BookServiceProxy - 생성자의 파라미터로 인터페이스
public class BookServiceProxy implements BookService{
BookService bookService;
public BookServiceProxy(BookService bookService) {
this.bookService = bookService;
}
@Override
public void run(Book book) {
System.out.println("aaaa");
bookService.run(book);
System.out.println("bbbb");
}
}
- DefaultBookService
public class DefaultBookService implements BookService{
@Override
public void run(Book book) {
System.out.println("rent: "+book.getTitle());
}
}
- BookServiceTest
public class BookServiceTest {
//BookService bookService = new DefaultBookService();
BookService bookService = new BookServiceProxy(new DefaultBookService());
@Test
public void di() {
Book book = new Book();
book.setTitle("spring");
bookService.run(book);
}
}
프록시의 인스턴스를 생성할 때 리얼 서브젝트의 인스턴스도 끼워서 생성하면서
실행 시 각각의 영역이 구별되어 실행되는 느낌
* realSubject를 가지고 있더라도 쓰지 않을 수 도 있다.
Code Link
https://github.com/mike6321/PURE_JAVA/tree/master/TheJava/proxy-pattern
'Java > Java' 카테고리의 다른 글
(JAVA) 클래스의 프록시 생성 (0) | 2019.12.24 |
---|---|
(JAVA) 다이나믹 프록시 (0) | 2019.12.24 |
(JAVA) 리플렉션 API(4) - 나만의 DI 프레임워크 만들어보기 (0) | 2019.12.24 |
(JAVA) 리플렉션 API(3) - 클래스 정보 수정 또는 실행 (0) | 2019.12.23 |
(JAVA) 리플렉션 API(2) - 애노테이션과 리플렉션 (0) | 2019.12.22 |