안녕하세요.
오늘은 프록시 패턴에 대해서
이야기 하려고 합니다.
프록시(Proxy)라는 단어의 사전적 의미를 살펴보면
"대리인" 이라는 뜻이 입니다.
자바 코드에서 생각하면 어떤 클래스의
대리를 수행하는 클래스 정도로 생각 해 볼 수 있습니다.
Proxy패턴을 사용하는 경우는 실제 객체의 생성시간이 오래 걸리는
경우 일을 분업하여 간단한 초기 작업들은 Proxy에서 수행을 하고
가장 중요한 마지막 작업에서 Proxy객체는 실제 객체를
생성하고 위임시키게 됩니다.
아래에서 Mail과 MailProxy클레스를 가지고 Proxy패턴에 대해서
설명 해보도록 하겠습니다.
MailProxy는 보내는 사람(formName)과 받는 사람(toName)을 설정하고
실제 메일을 보낼때 Mail 객체를 생성하여 위임 시키게 됩니다.
예제로 MailProxy 클래스를 작성해 보도록 하겠습니다.
[클래스 다이어그램]
[Main]
public class Main { public static void main(String[] args) throws InterruptedException { MailProxy mailProxy = new MailProxy(); mailProxy.setFromName("피터팬"); mailProxy.setToName("팅커벨"); mailProxy.send(); } } |
[MailProxy]
public class MailProxy implements Senderble {
private Mail mail; private String toName; private String fromName;
@Override public void setFromName( String name) { if( mail != null){ mail.setFromName( name ); }
this.fromName = name;
}
@Override public void setToName( String name) { if( mail != null){ mail.setToName( name ); } this.toName = name; }
// 실제 Mail의 객체를 거치지 않고도 대리인 만으로 사용가능 public String getToName() { return toName; }
// 실제 Mail의 객체를 거치지 않고도 대리인 만으로 사용가능 public String getFromName() { return fromName; }
@Override // 여러 사용자가 사용하기 때문에 객체가 여러번 생성이 될 수 있습니다. // 따라서 동기화 synchronized를 사용 했습니다. public synchronized void send() throws InterruptedException { if( mail == null){ mail = new Mail(); } mail.send(); } } |
[Mail]
public class Mail implements Senderble {
private String toName; private String fromName;
public Mail() throws InterruptedException { System.out.println("Mail 객체 생성 시작....."); Thread.sleep(5000); System.out.println("Mail 객체 생성 끝....."); }
@Override public void setFromName(String name) { this.fromName = name; }
@Override public void setToName(String name) { this.toName = name; }
@Override public void send() { //..... do somthing }
@Override public String getFromName() { return this.fromName; }
@Override public String getToName() { return this.toName; } }
|
[Senderble]
public interface Senderble { void setFromName( String nam); void setToName( String nam); String getFromName(); String getToName(); void send() throws InterruptedException; } |
'프로그래밍 > Java' 카테고리의 다른 글
[JAVA/사용자정의함수] 다양한 옵션으로 콘솔입력하는 함 (0) | 2017.08.22 |
---|---|
[사용자정의함수] 구분자 이용하여 배열을 합치는 함수 (0) | 2017.08.22 |
[JAVA/실습] 나누어 떨어진 수와 입력값 일치 (0) | 2016.10.08 |
[JAVA/실습] N번째 소수 구하기. (0) | 2016.10.08 |
[자바/JAVA] 디자인패턴 #3 스트레티지 패턴(Strategy Pattern) (0) | 2016.09.13 |