代理模式

Posted liaowenhui

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了代理模式相关的知识,希望对你有一定的参考价值。

首先我们通过一张图来说明什么是代理模式(后面会有具体的实例):

技术图片

什么是代理模式?

定义:客户端(Client)不直接调用真实对象,而是通过调用代理对象去调用真实对象。

为什么要用代理模式?:

在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用

优缺点?

优点: 1、职责清晰。 2、高扩展性。 3、起到了中介的作用和保护了目标对象的作用。

缺点: 1、由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。 2、实现代理模式需要额外的工作,有些代理模式的实现非常复杂。

应用实例: 

1、Windows 里面的快捷方式(Windows桌面上那些五颜六色的图标,快捷方式是Windows提供的一种快速启动程序、打开文件或文件夹的方法。它是应用程序的快速连接。)。

2、买火车票不一定在火车站买,也可以去代售点买

3、Spring AOP。

和适配器模式和装饰器模式的区别

1、和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理模式不能改变所代理类的接口。

2、和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了加以控制。

模式结构

一个是真正的你要访问的对象(目标类),一个是代理对象,真正对象与代理对象实现同一个接口,先访问代理类再访问真正要访问的对象。

代理模式分为静态代理、动态代理。

静态代理是由程序员创建或工具生成代理类的源码,再编译代理类。所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。

动态代理是在实现阶段不用关心代理类,而在运行阶段才指定哪一个对象。

实例分析

抽象接口:

package Proxy;
/** * @author 佛大java程序员 * @since 1.0.0 */ public interface Image { void display(); }

真实对象:

package Proxy;

/**
 * @author 佛大java程序员
 * @since 1.0.0
 */
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);
    }
}

代理对象:

package Proxy;

/**
 * @author 佛大java程序员
 * @since 1.0.0
 */
public class ProxyImage implements Image{

    private RealImage realImage;
    private String fileName;

    public ProxyImage(String fileName){
        this.fileName = fileName;
    }

    @Override
    public void display() {
        if(realImage == null){
            realImage = new RealImage(fileName);
        }
        realImage.display();
    }
}

客户端(Client):

package Proxy;

/**
 * @author 佛大java程序员
 * @since 1.0.0
 */
public class Client {
    public static void main(String[] args) {
        Image image = new ProxyImage("佛大java程序员.jpg");

        // 图像将从磁盘加载
        image.display();
        System.out.println("");
        // 图像不需要从磁盘加载
        image.display();
    }

运行结果:

技术图片

参考:

百度百科 -- 代理模式

https://baike.baidu.com/item/%E4%BB%A3%E7%90%86%E6%A8%A1%E5%BC%8F/8374046?fr=aladdin

菜鸟教程 --  代理模式

https://www.runoob.com/design-pattern/proxy-pattern.html

掘金 --  3种代理模式-理解Spring Aop

https://juejin.im/post/5cea0180e51d4550bf1ae7db#heading-3

以上是关于代理模式的主要内容,如果未能解决你的问题,请参考以下文章

scrapy按顺序启动多个爬虫代码片段(python3)

用于从 cloudkit 检索单列的代码模式/片段

java代码实现设计模式之代理模式

代理模式(静态代理动态代理)代码实战(详细)

Java设计模式-代理模式之动态代理(附源代码分析)

代理模式(静态代理)