개발공부/Java

[Java] 프록시(Proxy) 패턴

환타몬 2022. 2. 7. 00:04

proxy는 대리인이라는 뜻으로써, 뭔가를 대신해서 처리하는 것

 

Proxy Class를 통해서 대신 전달하는 형태로 설계되며, 실제 Client는 Proxy로 부터 결과를 받는다.

Cache의 기능으로도 활용이 가능하다.

SOLID중에서 개방폐쇄 원칙(COP)와 의존 역전 원칙(DIP)를 따른다.

 


IBrowser.java

package com.company.design.proxy;

public interface IBrowser {
    Html show();
}

 

 

- Html.java

package com.company.design.proxy;

public class Html {

    private String url;

    public Html(String url){
        this.url = url;
    }
}

 

 

- BrowserProxy.java

package com.company.design.proxy;

public class BrowserProxy implements IBrowser{

    private String url;
    private Html html;

    public BrowserProxy(String url){
        this.url = url;
    }

    @Override
    public Html show() {

        if(html == null){
            this.html = new Html(url);
            System.out.println("BrowserProxy loading html from :"+url);
        }
        System.out.println("BrowserProxy use cache html :"+url);
        return html;
    }
}

 

- Browser.java

package com.company.design.proxy;

public class Browser implements IBrowser{

    private String url;

    public Browser(String url){
        this.url = url;
    }


    @Override
    public Html show() {
        System.out.println("browser loading html from : "+url);
        return new Html(url);
    }
}

 

- Main.java

package com.company.design;

import com.company.design.adapter.*;
import com.company.design.aop.AopBrowser;
import com.company.design.proxy.Browser;
import com.company.design.proxy.BrowserProxy;
import com.company.design.proxy.IBrowser;
import com.company.design.singleton.AClazz;
import com.company.design.singleton.BClazz;
import com.company.design.singleton.SocketClient;

import java.util.concurrent.atomic.AtomicLong;

public class Main {

    public static void main(String[] args){
        


        AtomicLong start = new AtomicLong();
        AtomicLong end = new AtomicLong();


        IBrowser aopBrowser = new AopBrowser("www.naver.com",
                ()->{
                    System.out.println("before");
                    start.set(System.currentTimeMillis());
                },
                ()->{
                    long now = System.currentTimeMillis();
                    end.set(now - start.get());
                }
                );

        aopBrowser.show();
        System.out.println("loading time : "+end.get());

        aopBrowser.show();
        System.out.println("loading time : "+end.get());

    }


}

 

=======  출력  =======