Java/Design Pattern

[헤드퍼스트 디자인 패턴] 11. 프록시 패턴

noahkim_ 2024. 12. 18. 22:42

에릭 프리먼 님의 "헤드퍼스트 디자인 패턴" 책을 정리한 포스팅 입니다


1. 원격 프록시

  • 원격 객체의 로컬 대변자
    • 어떤 메서드를 호출하면, 다른 원격 객체에게 그 메서드 호출을 전달해 주는 객체
  • 핵심 작업이 아닌 저수준 작업을 프록시 객체에서 대신 처리함
    • 클라이언트 객체는 원격 객체의 메서드 호출을 하는 것처럼 행동

 

2. RMI

  • 클라이언트와 서비스 보조 객체를 만들어 줌
    • 입출력 및 네트워크 관련 코드를 직접 작성하지 않아도 됨

 

스텁
  • 클라이언트 보조 객체

 

스켈레톤
  • 서비스 보조 객체

 

3. Dating

Person

public interface Person {
    String getName();
    String getGender();
    String getInterests();
    int getGeekRating();
    
    void setName(String name);
    void setGender(String gender);
    void setInterests(String interests);
    void setGeekRating(int rating);
}
  • 자신의 정보를 직접 수정하는 것을 막아야 함

 

Proxy

InvocationHander (java.lang.reflect)
public interface InvocationHandler { 	
    Object invoke(Object proxy, Method method, Object[] args) throws Throwable;        
}
  • 프록시의 행동을 구현

 

public class OwnerInvocationHandler implements InvocationHandler {
    Person person;
    
    public OwnerInvocationHandler(Person person) { this.person = person; }
    
    public Object invoke(Object proxy, Method method, Object[] args) throws IllegalAccessException {
    	try {
            if (method.getName().equals("setGeekRating") throw new IllegalAccessException();
            
            if (method.getName().startsWith("get") || method.getName().startsWith("set")) return method.invoke(person, args);            
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        
        return null;
    }
}
  • 자신 핸들러
  • 클라이언트용 핸들러

 

동적 프록시 생성
Person getOwnerProxy(Person person) {
    return (Person) Proxy.newProxyInstance(
    	person.getClass().getClassLoader(),
        person.getClass().getInterfaces(),
        new OwnerInvocationHandler(person));
}