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)
  • 日志、事务等功能增强
相关推荐
程序员小假11 分钟前
我们来说一下 b+ 树与 b 树的区别
java·后端
阿贵---28 分钟前
C++中的RAII技术深入
开发语言·c++·算法
Traced back34 分钟前
怎么用 Modbus 让两个设备互相通信**,包含硬件接线、协议原理、读写步骤,以及 C# 实操示例。
开发语言·c#
Meepo_haha42 分钟前
Spring Boot 条件注解:@ConditionalOnProperty 完全解析
java·spring boot·后端
2401_8942419243 分钟前
用Pygame开发你的第一个小游戏
jvm·数据库·python
sheji34161 小时前
【开题答辩全过程】以 基于springboot的房屋租赁系统的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
木井巳1 小时前
【递归算法】子集
java·算法·leetcode·决策树·深度优先
行百里er2 小时前
优雅应对异常,从“try-catch堆砌”到“设计驱动”
java·后端·代码规范
娇娇yyyyyy2 小时前
QT编程(17): Qt 实现自定义列表模型
开发语言·qt