Writing /volume1/Web/Public/dokuwiki/data/log/deprecated/2024-11-15.log failed

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
study:java:design_pattern:proxy [2008/10/13 14:54] bananastudy:java:design_pattern:proxy [2021/05/12 00:27] (現在) – [ImageProxy Class] banana
行 2: 行 2:
 원격 프록시(Remote Proxy)는 일반적인 프록시 패턴(Proxy Pattern)을 구현하는 방법 가운데 하나입니다. 원격 프록시(Remote Proxy)는 일반적인 프록시 패턴(Proxy Pattern)을 구현하는 방법 가운데 하나입니다.
 이 외에도 몇 가지 변형된 방법이 있는데, 잠시 후에 알아보도록 하겠습니다. 일단 지금은 일반 프록시 패턴 이 외에도 몇 가지 변형된 방법이 있는데, 잠시 후에 알아보도록 하겠습니다. 일단 지금은 일반 프록시 패턴
-에 대해서 살보도록 하겠습니다.+에 대해서 살보도록 하겠습니다.
  
 프록시 패턴은 다음과 같이 정의됩니다. 프록시 패턴은 다음과 같이 정의됩니다.
行 71: 行 71:
 같은 메세지를 보여주면 되니까요. 일단 이미지 로딩이 끝나고 나면 프록시에서는 아이콘 객체한테 모든 작업을 같은 메세지를 보여주면 되니까요. 일단 이미지 로딩이 끝나고 나면 프록시에서는 아이콘 객체한테 모든 작업을
 맡기면 됩니다. 맡기면 됩니다.
 +
  
 ===== Design of CD Cover viewer ===== ===== Design of CD Cover viewer =====
行 80: 行 81:
 {{:study:java:design_pattern:virtual_proxy.jpg|Virtual Proxy}} {{:study:java:design_pattern:virtual_proxy.jpg|Virtual Proxy}}
  
-**ImageProxy 작동 방법**+**%%ImageProxy%% 작동 방법**
  
-  - **ImageProxy에서는 우선 ImageIcon을 생성하고 네트워크 URL로부터 이미지를 불러옵니다.**+  - **%%ImageProxy%%에서는 우선 %%ImageIcon%%을 생성하고 네트워크 URL로부터 이미지를 불러옵니다.**
   - **이미지를 가져오는 동안에는 "Loading CD Cover, please wait..."라는 메세지를 화면에 표시합니다.**   - **이미지를 가져오는 동안에는 "Loading CD Cover, please wait..."라는 메세지를 화면에 표시합니다.**
   - **이미지 로딩이 끝나면 paintIcon(), getWidth(), getHeight()를 비롯한 모든 메소드 호출을 이미지 아이콘 객체한테 넘깁니다.**   - **이미지 로딩이 끝나면 paintIcon(), getWidth(), getHeight()를 비롯한 모든 메소드 호출을 이미지 아이콘 객체한테 넘깁니다.**
-  - **사용자가 새로운 이미지를 요청하면 프록시를 새로 만들고 위이 을 새로 진행합니다.**+  - **사용자가 새로운 이미지를 요청하면 프록시를 새로 만들고 위의 을 새로 진행합니다.** 
 + 
 + 
 + 
 +===== ImageProxy Class ===== 
 +<code java> 
 +/** 
 + * 네트워크를 통해서 이미지를 가져오는 동안 대신 실제객체를 대신하는 Proxy클래스입니다.<br/> 
 + * imageIcon의 인스턴스가 만들어진 후에 화면을 표시하게 되면 paintIcon()메소드가 호출되면서 로딩중이라는 
 + * 메시지가 아닌 실제 이미지가 화면에 표시됩니다. 
 + *  
 + * @author Administrator 
 + * 
 + */ 
 +public class ImageProxy implements Icon { 
 + ImageIcon imageIcon; 
 + URL imageURL; 
 + Thread retrievalThread; //이미지를 가져오기위한 스레드, 사용자인터페이스가 죽지않도록 별도의 스레드를 생성. 
 + boolean retrieving = false; 
 +  
 +  
 + public ImageProxy(URL imageURL) { 
 + super(); 
 + this.imageURL = imageURL; 
 +
 + 
 + /* (non-Javadoc) 
 + * @see javax.swing.Icon#getIconHeight() 
 + */ 
 + public int getIconHeight() { 
 + if (imageIcon != null) return imageIcon.getIconHeight(); 
 + else return 600; 
 +
 + 
 + /* (non-Javadoc) 
 + * @see javax.swing.Icon#getIconWidth() 
 + */ 
 + public int getIconWidth() { 
 + if (imageIcon != null) return imageIcon.getIconWidth(); 
 + else return 800; 
 +
 + 
 + /* (non-Javadoc) 
 + * @see javax.swing.Icon#paintIcon(java.awt.Component, java.awt.Graphics, int, int) 
 + */ 
 + 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 CD cover, please wait...", x + 300, y + 190); 
 + //이미지를 가져오고 있는 중이 아니면... 
 + if (!retrieving) { 
 + //이미지 로딩작업 시작.(repaint()메소드는 한 스레드에서만 호출하기 때문에, 스레드 안전성은 확보되었다고 
 + //할 수 있습니다. 
 + retrieving = true; 
 + 
 + //사용자 인터페이스가 죽지 않도록 별도의 스레드에서 이미지를 가져옵니다. 
 + retrievalThread = new Thread(new Runnable(){ 
 + public void run(){ 
 + try { 
 + //이 스레드 내에서 Icon객체의 인스턴스를 생성했습니다. 이미지가 완전히 로딩되어야 생성자에게 객체를 리턴합니다. 
 + imageIcon = new ImageIcon(imageURL, "CD Cover"); 
 + //이미지가 확보되고 나면 repaint()메소드를 호출해서 화면을 갱신합니다. 
 + c.repaint(); 
 + } catch (Exception e) { 
 + e.printStackTrace(); 
 +
 +
 + }); 
 + 
 + retrievalThread.start(); 
 +
 +
 + 
 +
 + 
 +
 +</code> 
 + 
 + 
 +===== ImageComponent Class ===== 
 +<code java> 
 +/** 
 + * @author Administrator 
 + * 
 + */ 
 +public class ImageComponent extends JComponent { 
 + private Icon icon; 
 + 
 + public ImageComponent(Icon icon) { 
 + super(); 
 + this.icon = icon; 
 +
 + 
 + public void setIcon(Icon icon) { 
 + this.icon = icon; 
 +
 + 
 + @Override 
 + protected void paintComponent(Graphics g) { 
 +  
 + super.paintComponent(g); 
 + int w = icon.getIconWidth(); 
 + int h = icon.getIconHeight(); 
 + int x = (800 - w) / 2; 
 + int y = (600 - h) / 2; 
 + icon.paintIcon(this, g, x, y); 
 +
 +  
 +  
 +
 +</code> 
 + 
 + 
 +===== Test of CD Cover Viewer ===== 
 +드디어 새로 배운 가상 프록시를 테스트해 볼 때가 되었습니다. 윈도우를 만들고 프레임을 준비하고 메뉴를 설치하고 
 +프록시를 생성해주는 %%ImageProxyTestDrive%%클래스를 미리 준비해 뒀습니다. 테스트용 클래스 코드는 다음과 
 +같습니다. 
 + 
 +<code java> 
 +public class ImageProxyTestDrive { 
 + ImageComponent imageComponent; 
 + JFrame frame = new JFrame("CD Cover View"); 
 + JMenuBar menuBar; 
 + JMenu menu; 
 + Hashtable cds = new Hashtable(); 
 + /** 
 + * @param args 
 + */ 
 + public static void main(String[] args) throws Exception{ 
 + ImageProxyTestDrive testDrive = new ImageProxyTestDrive(); 
 + 
 +
 +  
 + public ImageProxyTestDrive() throws Exception{ 
 + cds.put("Ambient: Music for Airports", "http://images.amazon.com/images/P/B000003S2K.01.LZZZZZZZ.jpg"); 
 + cds.put("Buddha Bar", "http://images.amazon.com/images/P/B00009XBYK.01.LZZZZZZZ.jpg"); 
 + cds.put("Ima", "http://images.amazon.com/images/P/B000005IRM.01.LZZZZZZZ.jpg"); 
 + cds.put("Karma", "http://images.amazon.com/images/P/B000005DCB.01.LZZZZZZZ.jpg"); 
 + cds.put("MCMXC A.D.", "http://images.amazon.com/images/P/B000002URV.01.LZZZZZZZ.jpg"); 
 + cds.put("Northern Exposure", "http://images.amazon.com/images/P/B000003SEN.01.LZZZZZZZ.jpg"); 
 + cds.put("Selected Ambient Works, Vol. 2", "http://images.amazon.com/images/P/B000002MNZ.01.LZZZZZZZ.jpg"); 
 + cds.put("oliver", "http://www.cs.yale.edu/homes/freeman-elisabeth/2004/9/Oliver_sm.jpg"); 
 +  
 + URL initialURL = new URL((String)cds.get("Selected Ambient Works, Vol. 2")); 
 + menuBar = new JMenuBar(); 
 + menu = new JMenu("Favorite CDs"); 
 + menuBar.add(menu); 
 + frame.setJMenuBar(menuBar); 
 +  
 + for (Enumeration e = cds.keys(); e.hasMoreElements();) { 
 + String name = (String)e.nextElement(); 
 + JMenuItem menuItem = new JMenuItem(name); 
 + menu.add(menuItem); 
 + menuItem.addActionListener(new ActionListener(){ 
 + public void actionPerformed(ActionEvent event){ 
 + imageComponent.setIcon(new ImageProxy(getCDUrl(event.getActionCommand()))); 
 + frame.repaint(); 
 +
 + }); 
 +  
 +
 +  
 + //프레임 및 메뉴 설정 
 + Icon icon = new ImageProxy(initialURL); 
 + imageComponent = new ImageComponent(icon); 
 + frame.getContentPane().add(imageComponent); 
 + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
 + frame.setSize(800, 600); 
 + frame.setVisible(true); 
 +
 +  
 + URL getCDUrl(String name){ 
 + try { 
 + return new URL((String)cds.get(name)); 
 + } catch (MalformedURLException e) { 
 + e.printStackTrace(); 
 + return null; 
 +
 +
 +
 +</code> 
 + 
 +**테스트 해 볼 것...** 
 +  - **메뉴를 이용하여 다른 CD 커버를 불러옵니다. 이미지 로딩이 완료될 때까지 프록시에서 로딩중이라는 메세지를 보여주는 것을 확인해 봐야 되겠죠?** 
 +  - **로딩중이라는 메시지가 화면에 표시된 상태에서 윈도우 크기를 조절해 봅시다. 프록시에서 이미지를 로딩하고 있을 때도 스윙 윈도우가 멈추거나 하진 않는지 확인해 봅시다.** 
 +  - **%%ImageProxyTestDrive%%에 여러분이 가지고 있는 CD를 추가해 봅시다.** 
 +다음은 로딩중일 때의 화면입니다. 
 + 
 +{{:study:java:design_pattern:loading.jpg|under loding}} 
 + 
 +로딩이 완료되면 이런 윈도우가 만들어집니다. 
 + 
 +{{:study:java:design_pattern:oliver.jpg|oliver}}
  
 +===== reference =====
 +  *[[http://www.syboos.jp/sysdesign/doc/20080624135350826.html?page=1|an example of Protection Proxy pattern
 +]]
  
  

QR Code
QR Code study:java:design_pattern:proxy (generated for current page)