[자바 디자인 패턴] 구조패턴 - 프록시 패턴

2021. 3. 17. 17:36 JAVA/Design Patterns

구조패턴 목록

 

이미지 변환이나 디코딩과 같이 비용이 높은 경우에 가상프록시 패턴이 유용할 것 같고, 엑세스 관련 기능은 자주 사용되는 부분이기 때문에 보호프록시 패턴은 항상 필요로 할 것 같다.

 

장점

 1) 가상 프록시 : 시간이 오래 걸리는 프로세스가 있다면 생성시 동작하도록 하던 로직을 함수를 호출하여 실행할 때 동작하도록 미뤄둘 수 있습니다. 따라서 프로그램이 시작되는 경우에는 오래 걸리지 않습니다.

 

2) 보호 프록시 : 권한별로 엑세스여부를 관리하는 경우에 사용하면 훨씬 더 편리하게 코드를 작성할 수 있습니다.

 

사용시기

 1) 가상 프록시 : 생성하는 데 많은 비용이 드는 객체를 대신하는 역할을 하고, 실제 객체의 사용시점을 제어할 수 있습니다.

   * 실제 객체는 클라이언트가 처음 요청 / 액세스 할 때만 생성되고 그 후에 프록시를 참조하여 객체를 재사용할 수 있습니다.

 

 2) 보호 프록시 :  실제 사용자가 적절한 컨텐츠에 엑세스하는지 여부를 확인하기 위해 권한 부여 계층의 역할을 합니다.

   * 사무실의 인터넷 액세스를 제한하는 프록시 서버. 유효한 웹 사이트와 컨텐츠만 허용되며 나머지는 차단.

 

UML - 가상 프록시

Interface Class : Text

public interface Text {
    public String fatch();
}

 

Implement Class : SecretText, ProxyText

public class SecretText implements Text {
    private String plainText;
    
    public SecretText(String title){
        this.plainText = SecretTextDecoder.decodeByTextTitle(title);
    }
    
    @Override
    public String fetch(){
        return plainText;
    }
}
public class ProxyText implements Text {
    private String title;
    private Text text;
    
    public ProxyText(String title){
        this.title = title;
    }
    
    @Override
    public String fetch(){
        if(text == null){
            text = new SecretText(title);
        }
        return "[proxy] : " + text.fetch();
    }
}

 

Util Class : SecretTextDecoder

public class SecretTextDecoder {
    public static String decodeByTextTitle(String title){
        try{
            Thread.sleep(300);
        }catch(InterruptedException e){
            e.printStackTrace();
        }
        return title;
    }
}

 

Operation Class : ProxyPatternDemo, TextProvider

public class ProxyPatternDemo {
    public static void main(String[] args){
        List<Text> textList = new ArrayList<>();
        
        textList.addAll(TextProvider.getSecretText(0,5));
        textList.addAll(TextProvider.getProxyText(5,20));
        
        textList.stream().map(Text::fetch).forEach(System.out::println);
    }
}
public class TextProvider {
    public static List<SecretText> getSecretText(int start, int end) {
        return IntStream.range(start, end)
                .mapToObj(i -> new SecretText(String.valueOf(i)))
                .collect(Collectors.toList());
    }
    
    public static List<ProxyText> getProxyText(int start, int end) {
        return IntStream.range(start, end)
                .mapToObj(i -> new ProxyText(String.valueOf(i)))
                .collect(Collectors.toList());
    }
}

 

UML - 보호 프록시

 

Interface Class : OfficeInternetAccess

public interface OfficeInternetAccess {  
    public void grantInternetAccess();  
}  

 

Implement Class : ProxyInternetAccess, RealInternetAccess

public class ProxyInternetAccess implements OfficeInternetAccess {  
    private String employeeName;  
    private RealInternetAccess realInternetAccess;  
    
    public ProxyInternetAccess(String employeeName) {  
        this.employeeName = employeeName;  
    }
    
    @Override   
    public void grantInternetAccess() {
        if (getRole(employeeName) > 4) {
            realInternetAccess = new RealInternetAccess(employeeName);  
            realInternetAccess.grantInternetAccess();  
        }   
        else {  
            System.out.println("No Internet access granted. Your job level is below 5");  
        }  
    }  
    
    public int getRole(String emplName) {  
        return 9;  
    }  
}
public class RealInternetAccess implements OfficeInternetAccess {  
    private String employeeName;  

    public RealInternetAccess(String empName) {  
        this.employeeName = empName;  
    }  
    
    @Override  
    public void grantInternetAccess() {  
        System.out.println("Internet Access granted for employee: "+ employeeName);  
    }  
}

 

Operation Class : ProxyPatternClient

public class ProxyPatternClient {  
    public static void main(String[] args) {  
        OfficeInternetAccess access = new ProxyInternetAccess("Ashwani Rajput");  
        access.grantInternetAccess();  
    }  
} 

 

 

출처 : https://www.javatpoint.com/

know-one-by-one.tistory.com/45