概念

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


代码实现

目录结构:


具体代码:

Client类、调用的是代理对象和目标对象,不涉及真实对象
package src.controller;


import src.service.Impl.SubjectProxy;
import src.service.Impl.Target;

/**
 * @author SHshuo
 * @data 2021/10/16--8:41
 * 策略模式
 */
public class Client {
    public static void main(String[] args) {
//        目标对象
        Target target = new Target("吕沫竹");
//        代理对象
        SubjectProxy subjectProxy = new SubjectProxy(target);

        subjectProxy.giveDolls();
        subjectProxy.giveChocolate();
        subjectProxy.giveFlowers();
    }
}

Target、目标对象
package src.service.Impl;

/**
 * @author SHshuo
 * @data 2021/10/16--9:52
 * 目标对象
 */
public class Target {
    private String name;

    public Target(String name){
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

真实对象、RealSubject
package src.service.Impl;

import src.service.Proxy;

/**
 * @author SHshuo
 * @data 2021/10/16--8:36
 * 真正对象
 */
public class RealSubject implements Proxy {

    private Target target;

    public RealSubject(Target target){
        this.target = target;
    }

    @Override
    public void giveDolls() {
        System.out.println(target.getName() + ": hshuo送你洋娃娃");
    }

    @Override
    public void giveFlowers() {
        System.out.println(target.getName() + ": hshuo送你鲜花");
    }

    @Override
    public void giveChocolate() {
        System.out.println(target.getName() + ": hshuo送你巧克力");
    }
}

代理对象、保存一个真实对象的引用可以访问到真实对象里面的方法、初始化代理对象相当于初始化真实对象、代理对象的接口方法与真实对象一致
总结来讲:就是无论调用代理对象的方法还是构造函数、实则都是调用真实对象的方法和构造函数
package src.service.Impl;

import src.service.Proxy;

/**
 * @author SHshuo
 * @data 2021/10/16--9:48
 */
public class SubjectProxy implements Proxy {

//    保存一个引用使代理对象可以访问实体
    private RealSubject realSubject;

//    初始化代理对象相当于初始化真实对象
    public SubjectProxy(Target target){
        realSubject = new RealSubject(target);
    }

//    提供一个与真实对象接口相同的接口、完全代替
    @Override
    public void giveDolls() {
        realSubject.giveDolls();
    }

    @Override
    public void giveFlowers() {
        realSubject.giveFlowers();
    }

    @Override
    public void giveChocolate() {
        realSubject.giveChocolate();
    }
}

UML类图




应用场景

  1. 远程代理:就是为了一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。(加入一个web引用,引用一个webservice,此时会在项目中生成一个webReference的文件和一些文件夹,这就使得客户端程序调用代理就可以解决远程访问的问题)。
  2. 虚拟代理:根据需要开销很大的对象。通过它来存放实例化需要很长时间的真实对象。(打开网页,最先看到的是文字、图片是一张一张下载看到的。那些未打开的图片框,就是通过虚拟代理来替代了真实图片,此时代理存储真实对象的路径和尺寸
  3. 安全代理:用于控制真实对象访问时的权限。
  4. 智能指引:是指当调用真实对象时,代理处理另外一些事


实质:代理模式其实就是在访问对象时引入一定程度的间接性,代理就是真实对象的代表