代理模式(二十)

Andy 2023年06月09日 578次浏览

一个类代表另一个类的功能
这里只讲代理模式,关于动态代理和静态代理请参考我另一个博客java中的代理

菜鸟案例:
我们将创建一个 Image 接口和实现了 Image 接口的实体类。ProxyImage 是一个代理类,减少 RealImage 对象加载的内存占用。
ProxyPatternDemo,我们的演示类使用 ProxyImage 来获取要加载的 Image 对象,并按照需求进行显示。
image.png
经过从前面设计模式一路学过来的脑回路
首先 左边肯定是一个接口两个实现类,这个没问题
然后 右边的实现类有左边实现类的属性,这样ProxyImage就有了RealImage的所有属性了方法了
这就代理上了,当然这是最简单的,主要是讲的代理模式,动态代理和静态代理就比这麻烦一些些

上代码
(1)创建一个接口。
Image.java

public interface Image {
   void display();
}

(2)创建实现接口的实体类。
RealImage.java

public class RealImage implements Image {
 
   private String fileName;
 
   public RealImage(String fileName){
      this.fileName = fileName;
      //输入的文件名字,当成上传文件
      loadFromDisk(fileName);
   }
 
   @Override
   public void display() {
      System.out.println("Displaying " + fileName);
   }
 
   private void loadFromDisk(String fileName){
      System.out.println("Loading " + fileName);
   }
}

ProxyImage.java

public class ProxyImage implements Image{
 //直接挂着了
   private RealImage realImage;
   private String fileName;
 
   public ProxyImage(String fileName){
      this.fileName = fileName;
   }
 
   @Override
   public void display() {
   //当调用这个方法时如果没有RealImage 对象,就会new一个,这样此对象的display就是RealImage 的display了
      if(realImage == null){
         realImage = new RealImage(fileName);
      }
      realImage.display();
   }
}

(3)当被请求时,使用 ProxyImage 来获取 RealImage 类的对象。
ProxyPatternDemo.java

public class ProxyPatternDemo {
   
   public static void main(String[] args) {
      Image image = new ProxyImage("test_10mb.jpg");
 
      // 图像将从磁盘加载
      image.display(); 
      System.out.println("");
      // 图像不需要从磁盘加载
      image.display();  
   }
}

执行程序,输出结果:

Loading test_10mb.jpg
Displaying test_10mb.jpg

Displaying test_10mb.jpg
————————————————
版权声明:本文为CSDN博主「胖墩的IT」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43113679/article/details/99470090