2016-05-31 1 views
0

http://www.tutorialspoint.com/design_pattern/proxy_pattern.htm프록시 디자인 패턴 - tutorialspoint.com 예를

안녕하세요, 위의 링크의 예제를 사용하여 자바 프록시 디자인 패턴을 이해하기 위해 찾고

. 주 방법에서 나는 차이점을 이해하지 못한다 :

//image will be loaded from disk 

    image.display(); 
    System.out.println(""); 

    //image will not be loaded from disk 

    image.display(); 

이것은 오타입니까? 같은 image.display() 메소드가 다른 출력을 어떻게 낼 수 있습니까?

고맙습니다.

+0

awwww right..thank you all !! – Bubu

+0

고마워요! 이것은 프록시 패턴의 올바른 의도 된 구현입니까? – Bubu

답변

1

아니요, 오타가 아닙니다.

  • 처음으로 image.display()으로 전화 할 때 디스크에서 이미지를로드합니다. 로드 된 내용을 저장하므로 ...
  • 두 번째 (이후 번에) 호출하면 디스크에서 이미지를 다시로드 할 필요가 없습니다.
+0

설명해 주셔서 감사합니다! – Bubu

3

이것은 오타가 아닙니다.

첫 번째 호출이됩니다
public class ProxyImage implements Image{ 

    private RealImage realImage; 
    private String fileName; 

    public ProxyImage(String fileName){ 
     this.fileName = fileName; 
    } 

    @Override 
    public void display() { 
     if(realImage == null){ 
     realImage = new RealImage(fileName); 
     } 
     realImage.display(); 
    } 
} 

, realImage가 null이며, 이미지가 디스크에서로드됩니다 : 당신이 튜토리얼에서 ProxyImage의 정의를 보면, 명확 상태를 가지고있다. 그 후로드 된 이미지는 image.realImage에 저장되고 표시됩니다. 두 번째 호출에서 이미지는 이미 캐시되어 있으므로 디스크에서로드 할 필요가 없습니다.

+0

고마워요! 이것은 프록시 패턴의 올바른 의도 된 구현입니까? – Bubu

+0

@Bubu 예, 이것은 프록시 패턴을 사용하는 방법의 예입니다. – hexafraction

0

유일한 차이점은 생성자를 사용하고 여기에 이미지를로드하는 기능 방법을 호출하는 것입니다. 이 프록시가 아닌 MainFunctionalityClass의 구현으로 인터페이스를 인스턴스화하고 해당 구현이이 생성자 내부의 이미지를로드하는 경우 그러나 프록시를 사용하면 MainFunctionalityClass에 래퍼를 적용하고 이번에는 호출 된 생성자가 Proxy의 생성자이므로 MainFunctionalityClass 생성자는 여기에서 건너 뜁니다.

class Proxy implements ICommon{ 
private String var; 

Proxy(String var){ 
this.var = var; //NO call to big functionality, not costly 
} 

callMainFunctionality(){ 
//uses var, MainFunctionalityClass() called 
// Costly call but it is called on demand, 
} 

class MainClassTest{ 
public static void main(String[] args){ 
ICommon p = new Proxy("abcd"); 
p.callMainFunctionality(); 
} 

} 

프록시 디자인 패턴은

  1. 가 느리게 수요에 큰 기능을 넣기에 사용할 수 있습니다로
    class MainFunctionalityClass implements ICommon{ 
    
        MainFunctionalityClass(){ 
        loadMainFunctionality(); // Costly call 
        } 
    } 
    

    는 프록시 클래스가 정의된다. (안 위에서 설명) 클라이언트의 작업

우리가 먼저 클래스 모두에서 동일한 인터페이스을 사용하기 위해 다음 프록시 클래스 구성을 사용할 필요가 그것을 구현하는 방법을 제한

  • .