티스토리 뷰

Paradigm/OOP

[객체지향] Proxy Pattern

Mr.SIM 2014. 8. 19. 16:51

Proxy란 1. 대리(권)   2. 대리인   3. (측정・계산하려는 다른 것을 대표하도록 이용하는) 대용물 등 대신 무엇을 하는 것을 뜻한다.


proxy패턴 또한 무슨 일을 대신할 객체를 만들어서 사용하는 것인데, 하는 일에 따라 분류가 된다.

 원격 프록시

 원격에 있는 객체를 대신하여 주는 프록시

 가상 프록시

 생성하기에 비용이 많이 드는 객체가 준비가 완료될때까지 대신하여 주는 프록시

 보호 프록시

 원 객체에 대한 접근 보호 기능을 제공하기 위해사용되는 프록시


이 글에는 가상 프록시에 대한 글을 써보겠다.

위에 테이블에 나온 글 그대로 가상 프록시는 무엇을 생성하는데, 그것의 생성하는 비용이 커서 준비할 동안 대신해준다. 예로 이미지를 보여주는데, 이미지 로드 시간이 길어서 Loading이라는 문구를 띄워주는 것이 있다.


이 예를 소스코드를 통해 확인해보기 전에 구조부터 알아보자.



자바의 Icon을 상속받는 ImageIcon이 있다. 이를 바로 사용하지않고, ImageIconProxy라는 클래스를 만들어서 ImageIcon을 사용하도록 하고, 이미지가 준비 안된 상태라면,  ImageIconProxy에서 Loading문구를 보여주게 된다.



public class ImageIconProxy implements Icon {
	private Icon imageIcon;
	private String IMAGE_URL;

	public ImageIconProxy(String url) {
		IMAGE_URL = url;
	}

	@Override
	public void paintIcon(final Component c, Graphics g, int x, int y) {

		if (imageIcon != null)
			imageIcon.paintIcon(c, g, x, y);
		else {
			g.drawString("Loading image", 100, 150);
			new Thread(new Runnable() {
				public void run() {
					try {
						imageIcon = new ImageIcon(getImage());
						c.repaint();
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
			}).start();
		}
	}

	public Image getImage() {
		Image image = null;
		try {
			URL url = new URL(IMAGE_URL);
			image = ImageIO.read(url);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return image;
	}

	@Override
	public int getIconHeight() {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public int getIconWidth() {
		// TODO Auto-generated method stub
		return 0;
	}
}


이 코드에서 중요하게 보아야 할 부분은 paintIcon()이다. 이 함수에서는 imageIcon값이 생성안되어 있다면, else문으로 빠저, "Loading image" 문구를 띄워주고, 쓰레드를 통해서 이미지를 웹에서 불러오도록 한다. 그 이후 다시 paintIcon()를 불러주고, 그때는 이미지가 있으므로 if문으로 들어가게 된다. 


이후에도 생성된 인스턴스를 반환하지 않는다면, Image를 웹에서 다시 받아올 필요는 없다. (Loading image문구가 생성안될 것이다.)


if (imageIcon != null)
    imageIcon.paintIcon(c, g, x, y);
else
   // loading....


다음은 이 코드의 결과화면이다.

왼쪽 이미지가 이미지 로드 전, 오른쪽 이미지(아이유)가 이미지 로드 이후이다.


- 예제 내용 첨부됨 -

virtualProxy.zip


'Paradigm > OOP' 카테고리의 다른 글

[객체지향] Bridge Pattern  (0) 2014.08.05
[객체지향] PrototypePattern  (0) 2014.08.05
[객체지향] Abstract Factory Pattern  (0) 2014.08.04
[OOP] Refactoring  (0) 2013.11.06
[OOP] Law of demeter  (0) 2013.10.30
댓글
최근에 올라온 글
최근에 달린 댓글
글 보관함
Total
Today
Yesterday