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)
  • 日志、事务等功能增强
相关推荐
shinelord明几秒前
【软件系统架构】事件驱动架构
数据结构·设计模式·架构·系统架构·软件工程
界面开发小八哥1 分钟前
「Java EE开发指南」用MyEclipse开发EJB 3无状态会话Bean(二)
java·ide·java-ee·eclipse·myeclipse
LCY1337 分钟前
spring security +kotlin 实现oauth2.0 认证
java·spring·kotlin
Evand J8 分钟前
【MATLAB例程】AOA定位、AOA与TOA混合定位,二维环境下的对比,基站(锚点数量)自适应调整,附代码下载链接
开发语言·matlab
soulermax10 分钟前
数字ic后端设计从入门到精通2(含fusion compiler, tcl教学)
java·linux·服务器
我的代码永没有bug15 分钟前
day1-小白学习JAVA---JDK安装和环境变量配置(mac版)
java·学习·macos
Thomas_YXQ18 分钟前
Unity3D ILRuntime与Scripting Backend整合指南
服务器·开发语言·unity·unity3d
Chandler2422 分钟前
Go:反射
开发语言·后端·golang
王有品26 分钟前
Spring MVC 一个简单的多文件上传
java·spring·mvc
盒子691029 分钟前
go for 闭环问题【踩坑记录】
开发语言·后端·golang