代理模式:静态代理和动态代理

目录

一、静态代理

1、优点

[2、 缺点](#2、 缺点)

3、示例

二、动态代理

1、优点

[2、 缺点](#2、 缺点)

3、示例

三、总结


在Java中,代理模式是一种结构型设计模式,它允许你在不改变目标对象代码的情况下,为目标对象提供一个代理对象,用以控制访问和增强功能。代理分为两种主要类型:静态代理和动态代理。

一、静态代理

静态代理是在编译时就确定了代理类的,开发者需要手动为每个被代理的类编写代理类。代理类会实现与被代理类相同的接口,并在其方法中调用被代理对象的方法。

1、优点

(1)简单:实现简单,直接在代理类中调用被代理类的方法。

(2)明确:静态代理的逻辑在编译时就被确定,便于理解和维护。

2、 缺点

(1)代码重复:如果有多个被代理类,开发者需要为每个类都写一个代理类,导致代码重复。

(2)灵活性差:无法针对不同的被代理类动态生成代理,使得代码的扩展性差。

3、示例
java 复制代码
interface UserService {
    void addUser(String user);
}

class UserServiceImpl implements UserService {
    public void addUser(String user) {
        System.out.println("Add user: " + user);
    }
}

class UserServiceProxy implements UserService {
    private UserService userService;

    public UserServiceProxy(UserService userService) {
        this.userService = userService;
    }

    public void addUser(String user) {
        System.out.println("Logging: Adding user " + user);
        userService.addUser(user);
    }
}

二、动态代理

动态代理则是在运行时生成代理类,它允许在不编写具体代理类的情况下,为任意目标对象提供代理功能。在Java中,动态代理通常使用java.lang.reflect.Proxy类来实现。

1、优点

(1)灵活性高:动态代理可以在运行时为不同的对象生成代理,避免了重复代码的问题。

(2)通用性:只需要实现接口即可为任意类生成代理,增加系统的可扩展性。

2、 缺点

(1)复杂性:由于是在运行时生成的,需要使用反射,增加了复杂性。

(2)性能问题:相较于静态代理,动态代理可能会有轻微的性能开销。

3、示例
java 复制代码
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

interface UserService {
    void addUser(String user);
}

class UserServiceImpl implements UserService {
    public void addUser(String user) {
        System.out.println("Add user: " + user);
    }
}

class DynamicProxyHandler implements InvocationHandler {
    private Object target;

    public DynamicProxyHandler(Object target) {
        this.target = target;
    }

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("Logging: Adding user " + args[0]);
        return method.invoke(target, args);
    }
}

public class Main {
    public static void main(String[] args) {
        UserService userService = new UserServiceImpl();
        UserService proxyInstance = (UserService) Proxy.newProxyInstance(
                UserService.class.getClassLoader(),
                new Class[]{UserService.class},
                new DynamicProxyHandler(userService)
        );
        proxyInstance.addUser("Alice");
    }
}

三、总结

1、静态代理: 手动创建,简单易懂,但不够灵活、存在代码重复。

2、动态代理: 运行时生成,灵活性高,可以为任何对象生成代理,但实现复杂性增加。

相关推荐
q567315231 天前
人工智能训练数据采集:稳定代理IP高并发方案全解析
人工智能·爬虫·网络协议·tcp/ip·代理模式·代理ip
wuqingshun31415913 天前
什么是代理模式?一般用在什么场景?
java·mysql·代理模式
我登哥MVP14 天前
走进 Gang of Four 设计模式:代理模式
设计模式·代理模式
折哥的程序人生 · 物流技术专研16 天前
Java 23 种设计模式:从踩坑到精通 | 番外:代理 vs 装饰器 —— Spring AOP 到底用了哪个?
java·代理模式·装饰器模式·java面试·java设计模式·springaop·从踩坑到精通
初学者,亦行者17 天前
算法设计与分析3:贪心法 - 求解最短路径问题(TSP)
算法·代理模式
2501_9160074720 天前
iPad 怎么抓包 从代理模式到暴力抓包的操作方法
android·ios·小程序·uni-app·代理模式·iphone·ipad
越甲八千20 天前
代理模式和适配器模式区别
代理模式·适配器模式
AI人工智能+电脑小能手24 天前
【大白话说Java面试题 第156题】【06_Spring篇】第16题:Spring 用到了哪些设计模式?
java·spring·设计模式·代理模式·工厂模式
许彰午1 个月前
36_Java设计模式之代理模式
java·设计模式·代理模式
devilnumber2 个月前
静态代理 & 动态代理:实战运用 + 场景区别 + 怎么选
java·开发语言·代理模式