代理模式:创建真实对象的效率如何?

用户名

在以下示例中,来自Wiki书https://en.wikibooks.org/wiki/Computer_Science_Design_Patterns/Proxy

我不知道这比仅创建真实对象并使用其中的显示图像更快或更有效。因为代理还是在displayImage方法中创建了真实的对象?

//on System B
    class ProxyImage implements Image {

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

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

    }

如果不使用代理,代理模式肯定会节省内存,因为它需要实例化两个对象(代理和实数),而不是仅实例化一个(实数)?

路易吉·门多萨(Luiggi Mendoza)

通过您发布的链接(重点是我的):

代理类ProxyImage在真实图像类本身之外的其他系统上运行,并且可以在该系统上表示真实图像RealImage可从磁盘访问映像信息。使用代理模式,的代码ProxyImage 避免了多次加载图像,从而以节省内存的方式从其他系统访问该图像

简而言之:它不节省内存,它可以加快应用程序的速度,因为您不需要每次都访问磁盘来读取真实图像。

这在代码的这一部分中得到了证明:

public void displayImage() {
    //if image is not loaded into memory
    if (image == null) {
        //then load it, go to disk only once
        image = new RealImage(filename);
    }
    //now it is in memory, display the real image
    image.displayImage();
}

为了更好地理解此问题,让我们更改类和接口的定义:

public interface Image {
    String getName();
    byte[] getData();
}

现在,RealImage该类将始终在磁盘中寻找数据,以防文件不存在(文件被删除或重命名):

public class RealImage implements Image {
    //implements all the operations going to disk...
    private String fileName;
    public RealImage(String fileName) {
        this.fileName = fileName;
    }
    @Override
    public String getName() {
        String name = "";
        //fancy operations to seek for the file in disk (in case it has been deleted)
        //read the data from file in disk
        //get the name
        name = ...;
        return name;
    }
    @Override
    public byte[] getData() {
        byte[] data;
        //again, fancy operations to seek for the file in disk (in case it has been deleted)
        //read the data from file in disk
        //get the image data for displaying purposes
        data = ...;
        return data;
    }
}

现在,我们的商品ProxyImage将充当代理,RealImage通过将数据保存到内存中来节省每次昂贵的磁盘任务:

public class ProxyImage implements Image {
    private String fileName;
    private RealImage realImage;
    private byte[] data;
    private String name;
    //implements all the operations going to disk...
    public RealImage(String fileName) {
        this.fileName = fileName;
    }
    @Override
    public String getName() {
        //in case we don't have the name of the image
        if (this.name == null) {
            //use a RealImage to retrieve the image name
            //we will create the instance of realImage only if needed
            if (realImage == null) {
                realImage = new RealImage(fileName);
            }
            //getting the image from the real image is highly costly
            //so we will do this only once
            this.name = realImage.getName();
        }
        return this.name;
    }
    @Override
    public byte[] getData() {
        //similar behavior for the data of the image
        if (this.data == null) {
            if (realImage == null) {
                realImage = new RealImage(fileName);
            }
            //highly costly operation
            this.data = realImage.getData();
        }
        return this.data;
    }
}

因此反映了为我们的代理使用代理好处RealImage

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

得到CDI代理的真实对象

来自分类Dev

如何使用代理捕获对象创建?

来自分类Dev

如何确保客户端在代理设计模式中使用代理对象?

来自分类Dev

Hibernate如何创建最终DTO类的代理对象?

来自分类Dev

如何创建真实类的定义?

来自分类Dev

从现有对象创建代理

来自分类Dev

从现有对象创建代理

来自分类Dev

如何知道emacs的真实模式名称?

来自分类Dev

如何使用代理获取某人的真实IP地址?

来自分类Dev

Ghost如何从Nginx(反向代理)获取真实IP?

来自分类Dev

如何使Pandas groupby对象的处理效率更高?

来自分类Dev

如何为任意范围的代理对创建正则表达式模式

来自分类Dev

如何设计基于运行时模式的依赖对象创建?

来自分类Dev

如何在MongoDB模式中创建嵌套对象

来自分类Dev

如何使用模式在 Javascript 中创建默认对象?

来自分类Dev

什么是真实透明的代理

来自分类Dev

如何代理JavaScript创建原语

来自分类Dev

如何创建动态代理链?

来自分类常见问题

如何在运行时使用LambdaMetaFactory创建代理对象?

来自分类Dev

如何创建一个包罗万象的对象代理?

来自分类Dev

如何在Ubuntu 13.04中获得Nautilus的“真实”压缩模式?

来自分类Dev

如何在Ubuntu 13.04中获得Nautilus的“真实”压缩模式?

来自分类Dev

如何创建“X”模式?

来自分类Dev

仅用于代理目的的组合对象与哪种设计模式相关?

来自分类Dev

JavaScript“对象”具有哈希表的效率如何?

来自分类Dev

如何通过使用for循环创建数组来提高时间效率?

来自分类Dev

创建TableLayout的时间太长。如何提高效率?

来自分类Dev

如何从代理对象获取代理的处理程序?

来自分类Dev

如何从代理对象获取代理的处理程序?

Related 相关文章

  1. 1

    得到CDI代理的真实对象

  2. 2

    如何使用代理捕获对象创建?

  3. 3

    如何确保客户端在代理设计模式中使用代理对象?

  4. 4

    Hibernate如何创建最终DTO类的代理对象?

  5. 5

    如何创建真实类的定义?

  6. 6

    从现有对象创建代理

  7. 7

    从现有对象创建代理

  8. 8

    如何知道emacs的真实模式名称?

  9. 9

    如何使用代理获取某人的真实IP地址?

  10. 10

    Ghost如何从Nginx(反向代理)获取真实IP?

  11. 11

    如何使Pandas groupby对象的处理效率更高?

  12. 12

    如何为任意范围的代理对创建正则表达式模式

  13. 13

    如何设计基于运行时模式的依赖对象创建?

  14. 14

    如何在MongoDB模式中创建嵌套对象

  15. 15

    如何使用模式在 Javascript 中创建默认对象?

  16. 16

    什么是真实透明的代理

  17. 17

    如何代理JavaScript创建原语

  18. 18

    如何创建动态代理链?

  19. 19

    如何在运行时使用LambdaMetaFactory创建代理对象?

  20. 20

    如何创建一个包罗万象的对象代理?

  21. 21

    如何在Ubuntu 13.04中获得Nautilus的“真实”压缩模式?

  22. 22

    如何在Ubuntu 13.04中获得Nautilus的“真实”压缩模式?

  23. 23

    如何创建“X”模式?

  24. 24

    仅用于代理目的的组合对象与哪种设计模式相关?

  25. 25

    JavaScript“对象”具有哈希表的效率如何?

  26. 26

    如何通过使用for循环创建数组来提高时间效率?

  27. 27

    创建TableLayout的时间太长。如何提高效率?

  28. 28

    如何从代理对象获取代理的处理程序?

  29. 29

    如何从代理对象获取代理的处理程序?

热门标签

归档