代理模式

代理(Proxy)模式属于结构型模式的一种。

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

Java内置的RMI机制就是一个远程代理 模式。JDBC的连接池返回的JDBC连接(Connection对象)是一个虚代理 ,到执行JDBC查询或更新操作时,才真正创建连接。用代理对象控制对原始对象的访问,是保护代理,比如我们常用的鉴权。

代理模式和装饰者模式有些类似。装饰者模式让调用者自己创建核心类,然后组合各种功能。代理模式不会自己创建再组合,代理模式让调用者以为获取到的是核心类接口,但实际上是代理类。

现实生活中,信用卡是银行账户的代理, 银行账户则是一大堆现金的代理。

代理模式通过封装一个已有接口,让调用方在不改变任何代码的前提下增强某些功能(例如,鉴权、连接池复用等)。

代理模式通常有以下组成部分:

  • 服务接口:定义了服务类和代理对象的公共接口。客户端通过此接口与代理对象和真实对象交互。
  • 服务类:实现了服务接口,是真正处理业务逻辑的对象。
  • 代理对象:实现了服务接口,持有服务类的引用,控制对服务类的访问。伪装成服务对象。
  • 客户端:使用代理对象,跟服务进行交互。

延迟创建真实对象示例。

1、服务接口

java 复制代码
public interface Subject {
    void request(); }
点击并拖拽以移动

2、服务类

java 复制代码
public class RealSubject implements Subject { @Override public void request() { System.out.println("RealSubject: Handling request."); } }

3、代理类

java 复制代码
public class Proxy implements Subject { private RealSubject realSubject; @Override public void request() { if (realSubject == null) { realSubject = new RealSubject(); // 延迟创建真实对象 } System.out.println("Proxy: Delegating request to RealSubject."); realSubject.request(); // 转发请求给真实对象 } }

4、客户端

java 复制代码
public class Client {
    public static void main(String[] args) { Subject proxy = new Proxy(); // 客户端通过代理对象访问 proxy.request(); // 代理对象处理请求 } }

代理模式的优缺点。

优点:

  • 解耦:客户端与真实对象解耦,客户端不需要知道具体的实现细节。
  • 增强功能:代理可以为真实对象增加额外的功能,比如日志记录、性能监控等。

缺点:

  • 增加系统复杂性:引入代理类会增加系统的复杂性。
  • 性能问题:代理类可能会影响性能,尤其是在每次访问都需要经过代理的情况下。

结构型模式差不多了,接下来我们要开始行为型模式了。

这个世界多得是为了生活而拼尽全力的人。-- 烟沙九洲