跳转至
阅读量:

设计模式——代理模式

一、基本概念

1. 定义

代理模式(英语:Proxy Pattern)是程序设计中的一种设计模式。

所谓的代理者是指一个类别可以作为其它东西的接口。代理者可以作任何东西的接口:网络连接、存储器中的大对象、文件或其它昂贵或无法复制的资源。

2. 优缺点

优点

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

缺点

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

3. 结构

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

image-20210302085101022

二、代码实现

抽象主题类

通过接口或抽象类声明真实主题和代理对象实现的业务方法:

package pers.designPattern.proxy;

public interface Subject {
    void request();
}

真实主题类

实现了抽象主题中的具体业务,是代理对象所代表的真实对象,是最终要引用的对象:

package pers.designPattern.proxy;

public class RealSubject implements Subject {
    @Override
    public void request() {
        System.out.println("访问真实主题!");
    }
}

代理类

提供了与真实主题相同的接口,其内部含有对真实主题的引用,它可以访问、控制或扩展真实主题的功能:

package pers.designPattern.proxy;

public class Proxy implements Subject {
    private RealSubject realSubject;

    @Override
    public void request() {
        if (realSubject == null) {
            realSubject = new RealSubject();
        }
        preRequest();
        realSubject.request();
        postRequest();
    }

    public void preRequest() {
        System.out.println("访问真实主题前的预处理...");
    }

    public void postRequest() {
        System.out.println("访问真实主题后的处理...");
    }
}

客户类

package pers.designPattern.proxy;

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

运行结果:

访问真实主题前的预处理...
访问真实主题!
访问真实主题后的处理...

参考:

评论