java - 代理设计模式的使用

标签 java design-patterns

我试图理解代理设计模式。但是我无法理解代理设计模式的用法。我从维基百科得到了这个代码示例

interface Image {
    public void displayImage();
}

//on System A 
class RealImage implements Image {

    private String filename = null;
    /**
     * Constructor
     * @param filename
     */
    public RealImage(final String filename) { 
        this.filename = filename;
        loadImageFromDisk();
    }

    /**
     * Loads the image from the disk
     */
    private void loadImageFromDisk() {
        System.out.println("Loading   " + filename);
    }

    /**
     * Displays the image
     */
    public void displayImage() { 
        System.out.println("Displaying " + filename); 
    }

}

//on System B 
class ProxyImage implements Image {

    private RealImage image = null;
    private String filename = null;
    /**
     * Constructor
     * @param filename 
     */
    public ProxyImage(final String filename) { 
        this.filename = filename; 
    }

    /**
     * Displays the image
     */
    public void displayImage() {
        if (image == null) {
           image = new RealImage(filename);
        } 
        image.displayImage();
    }

}

class ProxyExample {

   /**
    * Test method
    */
   public static void main(String[] args) {
        final Image IMAGE1 = new ProxyImage("HiRes_10MB_Photo1");
        final Image IMAGE2 = new ProxyImage("HiRes_10MB_Photo2");

        IMAGE1.displayImage(); // loading necessary
        IMAGE1.displayImage(); // loading unnecessary
        IMAGE2.displayImage(); // loading necessary
        IMAGE2.displayImage(); // loading unnecessary
        IMAGE1.displayImage(); // loading unnecessary
    }

}

在这个例子中,他们说第二次 dispalyImage 不需要加载。甚至直接访问 RealImage 对象也是可能的。

            final Image IMAGE1 = new RealImage("HiRes_10MB_Photo1");
            final Image IMAGE2 = new RealImage("HiRes_10MB_Photo2");

            IMAGE1.displayImage(); // loading necessary
            IMAGE1.displayImage(); // loading unnecessary
            IMAGE2.displayImage(); // loading necessary
            IMAGE2.displayImage(); // loading unnecessary
            IMAGE1.displayImage(); // loading unnecessary

我需要了解 ProxyImage 类在此模式中的用法。

最佳答案

你知道,我同意你的看法。我觉得有一个好得多的例子可以用于代理模式。 This seems to use the same example but it's explained much better.你应该看看那个。

基本上,这一切都归结为这条评论:

// create the Image Object only when the image is required to be shown

这就是 proxy 在此示例中为您提供的好处。如果您不显示图像,则无需支付加载图像的罚款:

package proxy;

/**
 * Image Viewer program
 */
public class ImageViewer {


    public static void main(String[] args) {

    // assuming that the user selects a folder that has 3 images    
    //create the 3 images   
    Image highResolutionImage1 = new ImageProxy("sample/veryHighResPhoto1.jpeg");
    Image highResolutionImage2 = new ImageProxy("sample/veryHighResPhoto2.jpeg");
    Image highResolutionImage3 = new ImageProxy("sample/veryHighResPhoto3.jpeg");

    // assume that the user clicks on Image one item in a list
    // this would cause the program to call showImage() for that image only
    // note that in this case only image one was loaded into memory
    highResolutionImage1.showImage();

    // consider using the high resolution image object directly
    Image highResolutionImageNoProxy1 = new HighResolutionImage("sample/veryHighResPhoto1.jpeg");
    Image highResolutionImageNoProxy2 = new HighResolutionImage("sample/veryHighResPhoto2.jpeg");
    Image highResolutionImageBoProxy3 = new HighResolutionImage("sample/veryHighResPhoto3.jpeg");


    // assume that the user selects image two item from images list
    highResolutionImageNoProxy2.showImage();

    // note that in this case all images have been loaded into memory 
    // and not all have been actually displayed
    // this is a waste of memory resources

    }

}

关于java - 代理设计模式的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28053847/

相关文章:

java - Gradle 任务 - 将参数传递给 Java 应用程序

JAVA读写COM口

java - 通过二分查找查找数组中存储的信息

java - Java 1.6 中是否有用于类似 lambda 语句的 OOB Command 接口(interface)?

javascript - 为 Node 应用程序设置正确的结构

java - 程序不会继续执行下一个方法

java - Java 或 PHP 中的移动 Web 应用程序框架

java - 有人可以推荐一个 java 8 模式来替换 switch 语句吗?

c++ - C++ 中的 OO 设计 - 用未知类型的子对象装饰父对象

flutter/Dart : Communication between features in Clean Architecure