객체 에 대한 참조 조사
, 객체에 대한 lock등
Proxy
프록시 종류 | 설명 |
---|---|
Remote Proxy | 요청 메시지와 인자를 인코딩하여 이를 다른 주소공간에 있는 실제 대상에게 전달 장점 : 객체의 실제 호출 위치를 숨길 수 있음 |
Virtual Proxy | 실제 대상에 대한 추가적 정보를 보유하여 실제 접근에 대한 지연 장점 : 객체에 대한 생성시점을 관리할 수 있음 |
Protection Proxy | 요청한 대상이 실제 요청할 수 있는 권한이 있는지 확인 장점 : 객체에 대한 추가적인 관리를 수행할 수 있음 |
/**
* @author Donggeun.kim
*/
public interface Content {
/**
* 컨텐트 내용을 보여준다 객체.
*/
void showContent();
}
public class ContentLoaderProxy implements Content {
private Optional<Content> maybeContent = Optional.empty();
/**
* 비디오 객체 다운로드
*/
@Override
public void showContent() {
maybeContent.ifPresentOrElse(content -> {
System.out.println("====로딩 완료====");
content.showContent();
}, () -> {
long startTime = System.currentTimeMillis();
try {
System.out.println("로딩... 다운로드 중 : 10%");
Thread.sleep(3000L);
System.out.println("로딩... 다운로드 중 : 50%");
Thread.sleep(3000L);
System.out.println("로딩... 다운로드 중 : 95%");
Thread.sleep(3000L);
maybeContent = Optional.of(new VideoContent());
maybeContent.get().showContent();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("다운로드 시간 : "+ (System.currentTimeMillis() - startTime)/1000 +" sec" );
});
}
}
public class Main {
public static void main(String ...args){
Content content = new ContentLoaderProxy();
content.showContent();
}
}
/**
* @author Donggeun.kim
*/
public class ContentStatisticsProxy implements Content{
private Content content;
public ContentStatisticsProxy(Content content) {
this.content = content;
}
@Override
public void showContent() {
System.out.println("로그 or 통계 or 뭐 스마트 포인터 일련의 작업들, 혹은 트랜잭션 시작");
content.showContent();
System.out.println("로그 마무리 통계 마무리 스마트포인터 마무리, 일련의 작업들, 트랜잭션 커밋 or 롤백 작업");
}
}
public class Main {
public static void main(String ...args){
Content content = new ContentLoaderProxy();
content.showContent();
System.out.println();
System.out.println();
//어떻게 보면 책임연쇄 작업도 가능
Content content2 = new ContentStatisticsProxy(content);
content2.showContent();
}
}