代理模式

概念

在有些情况下,一个客户不能或者不想直接访问另一个对象,这时需要找一个中介帮忙完成某项任务,这个中介就是代理对象。例如,购买火车票不一定要去火车站买,可以通过12306网站或者去火车票代售点买。

代理模式是一种结构型设计模式,它能够提供对象的替代品代理控制着对于原对象的访问,并允许在将请求提交给对象前后进行一些处理

代理模式结构

代理模式的主要角色如下:

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

代理模式实例

抽象Service

package proxy;

/**
 * 服务接口
 * 代理必须遵循该接口,才能伪装成被代理对象。
 */
public interface ServiceInterface {
    /**
     * 提供服务
     */
    void provideService();
}

被代理对象

package proxy;

/**
 * 提供实用的业务逻辑
 */
public class Service implements ServiceInterface{
    @Override
    public void provideService() {
        System.out.println("被代理对象:Service类运行业务逻辑!");
    }
}

代理

package proxy;

/**
 * 代理类
 * 包含一个指向服务对象的【引用成员变量】
 * 代理完成其任务(如延迟初始化、记录日志、访问控制和缓存等)后,会将请求传递给服务对象
 * 通常情况下,代理会对其服务对象的整个生命周期进行管理。
 */
public class Proxy implements ServiceInterface {
    // 被代理对象
    private Service service;

    @Override
    public void provideService() {
        if (service == null) {
            service = new Service();
        }

        preProcess();
        service.provideService();
        postProcess();
    }

    public void preProcess() {
        System.out.println("访问Service对象前,代理进行预处理!");
    }

    public void postProcess() {
        System.out.println("访问Service对象后,代理进行后续处理!");
    }
}

客户

package proxy;

/**
 * 客户端
 * 能通过同一接口与服务或代理进行交互,所以可在一切需要服务对象的代码中使用代理。
 */
public class Client {
    public static void main(String[] args) {
        Proxy proxy = new Proxy();
        proxy.provideService();
    }
}

输出结果:

访问Service对象前,代理进行预处理!
被代理对象:Service类运行业务逻辑!
访问Service对象后,代理进行后续处理!
posted @ 2021-03-12 01:29  chenzufeng  阅读(58)  评论(0编辑  收藏  举报