代理模式的分类
静态代理:代理类在编译时就已经确定,通常需要手动创建代理类。
动态代理:代理类在运行时动态生成,不需要提前创建,代理对象的创建由代理框架(如 JDK 动态代理或 CGLIB)控制。
特点 静态代理 动态代理
代理类创建时机 代理类在编译时已经确定,需要手动创建代理类 代理类在运行时动态生成,不需要提前创建
实现方式 手动编写代理类,代理类与目标类关系固定 使用代理框架(如 JDK 动态代理、CGLIB)在运行时创建代理类
目标类要求 目标类必须实现接口(或继承某个类) JDK 动态代理:目标类必须实现接口;CGLIB:不需要接口
静态代理的实现
静态代理就是在程序编译时就创建好代理类,并让代理类和目标类实现相同的接口。代理类通过调用目标类的方法来完成任务,同时可以在调用前后添加一些额外的操作。

delegates to
UserService
+save()
+update()
+delete()
UserServiceImpl
+save()
+update()
+delete()
UserServiceProxy
+save()
+update()
+delete()

示例:静态代理模式

接口定义:

public interface UserService {

void save(String username);
void update(Long id, String username);
void delete(Long id);

}
目标类实现:

public class UserServiceImpl implements UserService {

@Override
public void save(String username) {
    System.out.println("增加用户: " + username);
}

@Override
public void update(Long id, String username) {
    System.out.println("编辑用户: " + username);
}

@Override
public void delete(Long id) {
    System.out.println("删除用户: " + id);
}

}
静态代理类:

public class UserServiceProxy implements UserService {

private UserServiceImpl userService;

public UserServiceProxy(UserServiceImpl userService) {
    this.userService = userService;
}
@Override
public void save(String userName) {
    // 在调用实际方法之前,做一些操作(如记录日志)
    System.out.println("日志:在添加用户之前");
    userService.save(userName);  // 调用真实对象的方法
    System.out.println("日志:在添加用户之后");
}

@Override
public void update(Long id, String userName) {
    System.out.println("日志:在更新用户之前");
    userService.update(id, userName); 
    System.out.println("日志:在更新用户之后");
}

@Override
public void delete(Long id) {
    System.out.println("日志:在删除用户之前");
    userService.delete(id);  // 调用真实对象的方法
    System.out.println("日志:在删除用户之后");

已注销
1 声望1 粉丝