设计模式之Proxy模式

2018-08-15  本文已影响0人  水沉浓

Proxy 模式

意图

为其他对象提供一种代理以控制对这个对象的访问。

动机

对一个对象进行访问控制的一个原因是为了只有在我们确实需要这个对象时才对它进行创建和初始化。

应用场景

代理模式主要用于当我们需要一个简单对象来表示一个复杂对象的情形。如果创建对象的开销很大,那么可以==推迟其创建==,并使用一个简单对象来代理其功能直到必须立即创建的时候。这个简单对象就可以称为复杂对象的代理。


UML类图如下:

Proxy.jpg

参与者与协作者:

代码示例:

假如我们想要在电子邮件中附加一张图片。而添加一张照片并发送是一件耗费大量资源的操作。

这时我们使用代理模式,让我们能够在确实需要加载图片时才对它进行创建和初始化。

  1. 首先,我们创建一个能够被真实对象和代理对象实现的通用接口
public interface Image {
   void showImage();
}
  1. 建立一个真实图片类实现上述接口
public class RealImage implements Image {
 
   private URL url;
 
   public RealImage(URL url){
      this.url = url;
      loadImage(url);
   }
 
   @Override
   public void showImage() {
      System.out.println("Displaying " + url.getFile());
   }
 
   private void loadImage(URL url){
      System.out.println("Loading " + url.getFile());
   }
}

  1. 编写代理类,提供对真实图片类的访问。
public class ProxyImage implements Image{
 
   private RealImage realImage;
   private URL url;
 
   public ProxyImage(URL url){
      this.url = url;
   }
 
   @Override
   public void showImage() {
      if(realImage == null){
         realImage = new RealImage(url);
      }
      realImage.showImage();
   }
} 
  1. 测试
public class ProxyTest {
   
   public static void main(String[] args) {
      Image image = new ProxyImage(new URL("test.jpeg"));
 
      // 加载图片
      image.showImage(); 
      System.out.println("");
      // 图像加载过,则不需再次加载
      image.showImage();  
   }
}
上一篇 下一篇

猜你喜欢

热点阅读