java 代理模式实现代码

1、静态代理

接口类AdminService.java接口

public interface AdminService {
    void update();
    Object find();
}

实现类AdminServiceImpl.java

public class AdminServiceImpl implements AdminService{
    public void update() {
        System.out.println("修改管理系统数据");
    }

    public Object find() {
        System.out.println("查看管理系统数据");
        return new Object();
    }
}

代理类AdminServiceProxy.java

public class AdminServiceProxy implements AdminService {

    private AdminService adminService;

    public AdminServiceProxy(AdminService adminService) {
        this.adminService = adminService;
    }

    public void update() {
        System.out.println("判断用户是否有权限进行update操作");
        adminService.update();
        System.out.println("记录用户执行update操作的用户信息、更改内容和时间等");
    }

    public Object find() {
        System.out.println("判断用户是否有权限进行find操作");
        System.out.println("记录用户执行find操作的用户信息、查看内容和时间等");
        return adminService.find();
    }
}

测试类Test.java

public class Test {
    public static void main(String[] args) {
        AdminService adminService = new AdminServiceImpl();
        AdminServiceProxy proxy = new AdminServiceProxy(adminService);
        proxy.update();
        System.out.println("=============================");
        proxy.find();
    }
}

2、动态代理

接口类

public interface UserManager {
    public int get();
}

实现类

public class UserManagerImpl implements UserManager{

    @Override
    public int get() {
        return 0;
    }
}

代理类

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class LogHandler implements InvocationHandler {
    private Object targetObject;
    public Object newProxyInstance(Object targetObject){
        this.targetObject=targetObject;
        return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
                targetObject.getClass().getInterfaces(),this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        Object ret=null;
        try{

            /*原对象方法调用前处理日志信息*/
            System.out.println("开始-->>");
            ret=method.invoke(targetObject, args);
            /*原对象方法调用后处理日志信息*/
            System.out.println("完毕-->>");
        }catch(Exception e){
            throw e;
        }
        return ret;
    }
}

测试

public class Test {
    public static void main(String[] args) {
//        System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");
        LogHandler logHandler=new LogHandler();

        UserManager userManager=(UserManager)logHandler.newProxyInstance(new UserManagerImpl());

        System.out.println(userManager.get());

    }
}
posted @ 2021-11-02 13:18  BeanInJ  阅读(148)  评论(0)    收藏  举报
/* 点击爆炸效果*/