• 小谈设计模式(8)—代理模式


    专栏介绍

    专栏地址

    link

    专栏介绍

    主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。
    在这里插入图片描述

    代理模式

    代理模式是一种结构型设计模式,它允许通过创建一个代理对象来控制对其它对象的访问。代理对象充当了被代理对象的接口,客户端通过代理对象来访问被代理对象,从而实现了对被代理对象的间接访问。

    代理模式角色分析

    抽象主题(Subject)

    定义了代理对象和被代理对象的共同接口,客户端通过抽象主题来访问被代理对象。

    真实主题(Real Subject)

    实现了抽象主题接口,是被代理对象,代理对象将对其进行间接访问。

    代理(Proxy)

    实现了抽象主题接口,同时包含一个对真实主题的引用,客户端通过代理对象来访问真实主题。
    在这里插入图片描述

    应用场景

    远程代理

    代理模式常用于网络通信中,例如远程方法调用(RPC)。在分布式系统中,客户端可以通过代理对象来调用远程服务器上的方法,代理对象负责将调用请求发送到远程服务器并返回结果。远程代理隐藏了底层网络通信的细节,使得客户端可以像调用本地方法一样调用远程方法。

    虚拟代理

    虚拟代理用于在访问对象时进行一些额外的处理。一个常见的例子是延迟加载(Lazy Loading),当一个对象的创建或加载非常耗费资源时,可以使用虚拟代理来推迟对象的创建或加载,直到真正需要访问对象时才进行。例如,在图像加载时,可以使用虚拟代理来延迟加载图像数据,只有当需要显示图像时才真正加载图像数据。

    安全代理

    安全代理用于控制对对象的访问权限。例如,在一个权限管理系统中,可以使用安全代理来限制只有特定角色的用户才能访问某个对象。代理对象可以在访问真实对象前检查用户的角色,如果用户具有访问权限,则允许访问真实对象,否则拒绝访问。

    在这里插入图片描述

    智能引用代理

    智能引用代理用于在访问对象时添加一些额外的功能。一个常见的例子是缓存功能,代理对象可以在访问真实对象前先检查缓存中是否存在对应的结果,如果存在则直接返回缓存结果,避免重复计算。另外,还可以使用智能引用代理来实现对象池,代理对象可以管理对象的创建和销毁,并在访问对象时从对象池中获取对象。

    总结

    代理模式在许多实际应用中都有广泛的应用。通过引入代理对象,可以实现对被代理对象的间接访问,并可以在访问前后做一些额外的处理,如网络通信、延迟加载、权限控制和功能扩展等。代理模式可以提高系统的灵活性和可扩展性,同时也需要权衡系统的复杂性和性能。
    在这里插入图片描述

    Java程序实现

    首先,我们定义一个接口 Image,表示图像对象的接口:

    public interface Image {
        void display();
    }
    
    • 1
    • 2
    • 3

    其次,我们创建一个真实的图像类 RealImage,实现 Image 接口,表示真实的图像对象:

    public class RealImage implements Image {
        private String filename;
    
        public RealImage(String filename) {
            this.filename = filename;
            loadFromDisk();
        }
    
        private void loadFromDisk() {
            System.out.println("Loading image from disk: " + filename);
        }
    
        public void display() {
            System.out.println("Displaying image: " + filename);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    然后,我们创建一个代理类 ProxyImage,实现 Image 接口,表示图像的代理对象:

    public class ProxyImage implements Image {
        private String filename;
        private RealImage realImage;
    
        public ProxyImage(String filename) {
            this.filename = filename;
        }
    
        public void display() {
            if (realImage == null) {
                realImage = new RealImage(filename);
            }
            realImage.display();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    最后,我们可以使用代理对象来访问真实的图像对象,例如:

    public class Main {
        public static void main(String[] args) {
            Image image = new ProxyImage("test.jpg");
    
            // 第一次访问,会创建真实的图像对象并显示
            image.display();
    
            // 第二次访问,直接显示之前创建的真实图像对象
            image.display();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    输出结果

    Loading image from disk: test.jpg
    Displaying image: test.jpg
    Displaying image: test.jpg
    
    • 1
    • 2
    • 3

    程序分析

    在上面的示例中,ProxyImage 类充当了代理对象,它在访问真实的图像对象之前先进行了一些额外的处理。当第一次访问图像时,代理对象会创建真实的图像对象并显示;当第二次访问图像时,代理对象直接显示之前创建的真实图像对象,避免了重复加载和显示。通过代理对象,我们可以实现对真实对象的间接访问,并在访问前后做一些额外的处理。
    在这里插入图片描述

    优缺点分析

    优点

    代理模式可以实现对真实对象的间接访问,可以在访问前后做一些额外的处理,如权限控制、延迟加载、缓存等。
    代理对象可以隐藏真实对象的具体实现细节,保护真实对象的安全性。
    代理模式可以提高系统的灵活性和可扩展性,可以在不修改真实对象的情况下增加新的代理对象。
    代理模式符合单一职责原则,可以将真实对象和代理对象分离,分别负责各自的功能。

    缺点

    由于引入了代理对象,会增加系统的复杂性,增加了代码的数量和维护的难度。
    代理模式会引入额外的开销,因为需要通过代理对象来访问真实对象,可能会导致性能下降。
    如果代理对象的创建和销毁过程比较复杂,可能会影响系统的性能。
    在这里插入图片描述

    总结

    代理模式在许多实际应用中都有广泛的应用,可以提供额外的功能和保护真实对象的安全性。但是,在使用代理模式时需要权衡系统的复杂性和性能,确保代理对象的创建和销毁过程不会影响系统的性能。

  • 相关阅读:
    CSP-J 2023 T3 一元二次方程 解题报告
    【无标题】
    学习大数据可以进入哪些公司?
    vue在线预览word、excel、PDF
    关于文件选择器 input type=file原生样式的优化
    Monaco Editor教程(十三):在指定位置插入或替换文本
    墨云科技 web漏洞研究岗一面复盘
    C#【高级篇】 C# 接口(Interface)
    Selenium增加Chrome稳定性的参数
    【高级渗透篇】网络安全面试
  • 原文地址:https://blog.csdn.net/weixin_74888502/article/details/133456597