代理模式(Proxy)

xiaohai 2021-12-30 15:16:55 1543人围观 标签: 设计模式 
简介代理模式(Proxy)为其他对象提供一种代理以控制对这个对象的访问。 使用代理模式创建代理对象,让代理对象控制目标对象的访问(目标对象可以是远程的对象、创建开销大的对象或需要安全控制的对象),并且可以在不改变目标对象的情况下添加一些额外的功能。

模式定义

代理模式(Proxy)为其他对象提供一种代理以控制对这个对象的访问。

使用代理模式创建代理对象,让代理对象控制目标对象的访问(目标对象可以是远程的对象、创建开销大的对象或需要安全控制的对象),并且可以在不改变目标对象的情况下添加一些额外的功能。

在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用,并且可以通过代理对象去掉客户不能看到的内容和服务或者添加客户需要的额外服务。

模式优缺点

  • 优点

    • 代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用;
    • 代理对象可以扩展目标对象的功能;
    • 代理模式能将客户端与目标对象分离,在一定程度上降低了系统的耦合度
  • 缺点

    • 在客户端和目标对象之间增加一个代理对象,会造成请求处理速度变慢;
    • 增加了系统的复杂度;

适用场景

  • 远程代理,也就是为了一个对象在不同的地址空间提供局部的代表,这样可以隐藏一个对象在于不同的地址空间的事实;
  • 虚拟代理,是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象;
  • 安全代理,用来控制真实对象的访问时权限;

模式结构

  • 抽象主题(Subject)类:通过接口或抽象类声明真实主题和代理对象实现的业务方法;
  • 真实主题(Real Subject)类:实现了抽象主题中的具体业务,是代理对象所代表的真实对象,是最终要引用的对象;
  • 代理(Proxy)类:提供了与真实主题相同的接口,其内部含有对真实主题的引用,它可以访问、控制或扩展真实主题的功能;

模式实现

package com.company.proxy;

public class ProxyPattern {
    public static void main(String[] args) {
        Subject proxy = new Proxy();
        proxy.request();
    }
}

//抽象主题
interface Subject {
    void request();
}

//具体主题
class AreaOne implements Subject {
    @Override
    public void request() {
        System.out.println("区域1,请求");
    }
}

//代理主题
class Proxy implements Subject {

    Subject area;

    public Proxy() {
        System.out.println("代理处理");
        this.area = new AreaOne();
    }

    @Override
    public void request() {
        System.out.println("代理请求");
        area.request();
    }
}

运行结果:

代理处理
代理请求
区域1,请求