실제 기능을 수행하는 객체 대신 가상의 객체를 사용해 로직의 흐름을 제어하는 구조 패턴
- Subject : RealSubject와 Proxy를 위한 공통 인터페이스
- RealSubject : 실제 기능을 제공하는 클래스
- Proxy : RealSubject에 대한 접근을 제어하고, 객체의 생성과 삭제를 책임지는 클래스
영화를 상영한다고 가정해 보자. 상영하고자 하는 영화를 정할 때마다 다운로드를 하면 자원 낭비가 심할 것이다. 이때 프록시 패턴을 이용하면 영화가 상영 시작하려는 시점에 다운로드를 해서 자원낭비 없이 볼 수 있다.
[Movie.java]
public interface Movie {
void setMovieName(String name);
String getMovieName();
void start();
}
[Real_Movie.java]
public class Real_Movie implements Movie {
private String name;
public Real_Movie(String name) {
this.name = name;
download(this.name);
}
@Override
public void setMovieName(String name) {
this.name = name;
}
@Override
public String getMovieName() {
return this.name;
}
@Override
public void start() {
System.out.println(name + " | 상영 시작하겠습니다.");
}
private void download(String name) {
System.out.println("상연 전 영화 (" + name + ") 다운로드 하겠습니다.");
for (int i = 0; i < 3; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
System.out.println(".");
}
System.out.println("다운로드 완료.");
}
}
[Proxy_Movie.java]
public class Proxy_Movie implements Movie{
private String name;
private Real_Movie realMovie;
public Proxy_Movie(String name) {
this.name = name;
}
@Override
public void setMovieName(String name) {
this.name = name;
}
@Override
public String getMovieName() {
return this.name;
}
@Override
public void start() {
// 실제 영화 객체의 이름과 프록시 영화의 이름이 다른 경우
// 다시 다운로드 받게 한다.
realize();
realMovie.start();
}
private synchronized void realize() {
if (realMovie == null || !realMovie.getMovieName().equals(name)) {
realMovie = new Real_Movie(this.name);
}
}
}
public class Client {
public static void main(String[] args) {
Movie movie = new Proxy_Movie("공조");
System.out.println("영화 제목 : " + movie.getMovieName());
movie.setMovieName("신과 함께");
System.out.println("영화 제목 : " + movie.getMovieName());
movie.start(); // 객체 생성하고 다운로드 진행
movie.start(); // 이미 객체가 생성되 있어 다시 다운로드를 받지 않아됨
movie.setMovieName("범죄도시");
System.out.println("영화 제목 : " + movie.getMovieName());
movie.start(); // 영화가 바뀌었으므로 다시 객체를 생성해서 다운로드를 받아야 함
}
}
장점
단점
Composite Pattern
Decorator Pattern
Proxy Pattern