프로그래밍/디자인패턴

디자인 패턴 - Proxy (Structural Pattern)

aiemag 2021. 2. 20. 17:53
반응형

Structural Pattern의 마지막인 Proxy Pattern에 대해 정리합니다.

 

대리인(proxy)을 사용하는 이유는 내가 아니라도 가능한 일을 맡기기 위해서입니다.

 

내가 해야만 하는 중요한 일은 내가 하고, 아닌 일은 대리인에게 맡기도록 합시다.

 

 


Definition

 

Proxy 는 heavy한 작업은 필요할 때 직접하고, 맡길 수 있는 일은 proxy를 통해 하는 패턴입니다.

 

Proxy Pattern은 Structural Pattern에 해당합니다. (Structural Pattern은 이제 마지막이네요^^)

 


Class Diagram

 


Sample Case

 

다음은 Proxy 패턴을 적용한 시나리오입니다.

 

Scenario

우리는 Database에서 Query를 실행시키려고 합니다.

 

Database에서 Qeury를 실제 처리(process()) 하는데는 시간이 많이 걸리기 때문에,

 

Database의 이름을 확인하는 등의 간단한 용도(getDatabaseName())로는 Proxy(DatabaseProxy)를 이용하려고 합니다.

 

Class Diagram

실제 query() 가 필요한 처리는 Database의 instance를 만들어 process()를 실행하게 됩니다.

 

Code

 

1
2
3
4
5
6
7
public class Main {
    public static void main(String[] args) {        
        Queryable q = new DatabaseProxy("YourSQL");
        System.out.println("Current Databse : "+q.getDatabaseName());
        q.query("DESC TABLE;");
    }
}
cs

 

1
2
3
4
public interface Queryable {
    public abstract String getDatabaseName();
    public abstract void query(String queryString);    
}
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class Database implements Queryable{
    private String name;
    
    public Database(String name){
        this.name = name;        
    }
    
    public String getDatabaseName() {
        return this.name;
    }
    
    public void query(String queryString) {
        System.out.println("Query is : "+queryString);
        process();
    }
    
    private void process() {
        System.out.println("Getting data from server.");
        for(int i=0 ; i<3 ; i++) {
            try {
                Thread.sleep(1000);
            }catch(InterruptedException e) {}
            System.out.println(".");
        }
        System.out.println("Done.");
    }
}
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class DatabaseProxy implements Queryable{
    private String name;
    private Database real;
    
    public DatabaseProxy(String name) {
        this.name = name;
    }
    
    public String getDatabaseName() {
        return this.name;
    }
    
    public void query(String queryString) {
        realize();
        real.query(queryString);
    }
    
    private synchronized void realize() {
        if(real == null) {
            real = new Database(name);
        }
    }
}
cs

 

실행 결과

 

반응형