23种设计模式-结构型模式之代理模式(Java版本)

Java 代理模式(Proxy Pattern)详解

🧭 什么是代理模式?

代理模式是结构型设计模式之一,为其他对象提供一个代理以控制对这个对象的访问

就像生活中的"经纪人",你无法直接联系明星,但可以通过代理来安排见面或业务。


🧠 使用场景

  • 控制对象访问(权限控制)
  • 延迟加载(虚拟代理)
  • 远程代理(调用远程服务)
  • 增强原始对象功能(如日志、事务)

🏗️ 模式结构

  • Subject(抽象主题):定义代理与真实对象的公共接口
  • RealSubject(真实主题):实际执行操作的对象
  • Proxy(代理对象):控制对真实对象的访问

✅ 示例:上网代理

抽象接口

java 复制代码
public interface Internet {
    void access(String site);
}

真实主题

java 复制代码
public class RealInternet implements Internet {
    @Override
    public void access(String site) {
        System.out.println("访问网站: " + site);
    }
}

代理类:禁止访问黑名单网站

java 复制代码
import java.util.Arrays;
import java.util.List;

public class InternetProxy implements Internet {
    private Internet realInternet = new RealInternet();
    private List<String> bannedSites = Arrays.asList("facebook.com", "youtube.com");

    @Override
    public void access(String site) {
        if (bannedSites.contains(site)) {
            System.out.println("访问被禁止:" + site);
        } else {
            realInternet.access(site);
        }
    }
}

客户端调用

java 复制代码
public class Main {
    public static void main(String[] args) {
        Internet internet = new InternetProxy();
        internet.access("google.com");
        internet.access("facebook.com");
    }
}

🧩 优点

  • 控制对象访问权限,保护真实对象
  • 降低系统耦合度,增强灵活性
  • 可扩展真实对象的功能(如添加日志、安全控制)

⚠️ 缺点

  • 增加系统类的数量
  • 部分代理模式可能引入性能开销

🍭 常见实现

  1. 静态代理:手动写代理类,上例就是静态代理。
  2. 动态代理(JDK Proxy):运行时生成代理类,接口必须存在。
  3. CGLIB 代理:用于没有接口的类,通过继承实现代理。

✅ 使用建议

适合用在:

  • 安全控制(如登录验证)
  • 缓存或延迟加载(如图片加载)
  • 远程调用(如 RPC、RMI)
  • 日志、事务等功能增强
相关推荐
云烟成雨TD4 小时前
Spring AI Alibaba 1.x 系列【69】Token 用量统计
java·人工智能·spring
JAVA9654 小时前
JAVA面试-并发篇 03-使用synchronized doublecheck实现单例有什么坑
java·单例模式·面试
在繁华处4 小时前
Java从零到熟练(四):面向对象基础
java·开发语言
Unbelievabletobe4 小时前
解决了股票api接口盘后数据更新慢的问题
大数据·开发语言·python
不会C语言的男孩6 小时前
C++ Primer 第2章:变量和基本类型
开发语言·c++
小江的记录本6 小时前
【JVM虚拟机】堆内存分代模型:年轻代(Eden+Survivor)、老年代、元空间Metaspace(附《思维导图》+《面试高频考点清单》)
java·前端·jvm·后端·python·spring·面试
在繁华处6 小时前
Java从零到熟练(三):流程控制
java·开发语言·python
唐青枫6 小时前
Java Optional 实战指南:优雅处理空值与链式转换
java
一起学开源6 小时前
一文读懂 ReAct 范式:让 AI Agent 真正学会“思考+行动“
java·javascript·react.js·ecmascript·react·alibaba·智能体开发
云泽8087 小时前
C++ 可调用对象通关指南:深度解析 Lambda 表达式、function 包装器与 bind 绑定器
开发语言·c++·算法