代理模式 -- 动态代理

前言:
根据静态代理来实现Java中的动态代理模式。

一、什么是代理模式和静态代理
前往上一篇博客的传送门:博客地址

二、静态代理和动态代理的区别
在静态代理中代理对象需要我们自己手动创建,在动态代理中将自动创建代理对象而不需要我们手动创建。

三、根据之前博客中案例,实现Java中的动态代理
将代理者剔除之后的代码为:

1、房东接口

/**
 * 
 * @author 大家都说名字长不会被发现
 *  房东接口
 */
public interface Tenant {
    String rent(double money);
}

2、具体房东类

/**
 * 
 * @author 大家都说名字长不会被发现
 *
 *  陈姓房东类
 */
public class TenantByChen implements Tenant{

    public String rent(double money) {
        //房东获得扣除中介费后的房租
        System.out.println("出租房屋,"+"获得房租:"+money+"¥");

        //将钥匙给中介
        return "钥匙";
    }



}

3、租客类

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

/**
 * 
 * @author 大家都说名字长不会被发现
 *  租客类
 */
public class Landlord {
    public static void main(String[] args){
        Landlord landlord = new Landlord();
        landlord.renting();
    }

    public void renting(){
        //找中介公司租房
        final Tenant chen = new TenantByChen();

        /**
         * req.getClass().getClassLoader()  与目标对象相同的类加载器
         * req.getClass().getInterfaces()   与目标对象相同的字节码对象数组
         * new InvocationHandler()  回掉接口
         */
        Tenant tenant = (Tenant) Proxy.newProxyInstance(
                chen.getClass().getClassLoader(),
                chen.getClass().getInterfaces(), 
                new InvocationHandler() {

                    /**
                     * Object proxy     代理对象
                     * Method method    调用方法
                     * Object[] args    传递参数
                     */
                    public Object invoke(Object proxy, Method method, Object[] args)
                            throws Throwable {
                        for (Object object : args) {
                            double money = (Double) object;

                            //扣除中间费
                            money = money - 800.00;
                            System.out.println("中介获得,"+800.00+"¥中介费");
                            String key = (String) method.invoke(chen, money);
                            //替换门锁
                            key = "换锁后的新"+key;
                            return key;
                        }
                        return null;
                    }
                });

        //调用中介出租房屋功能
        String key = tenant.rent(2500.00);
        System.out.println("租客获得"+key);
    }


}

可以看到代码的变化是,剔除了原本的代理者类。使用Java提供API(Proxy.newProxyInstance)来动态获取代理者对象,其他类均保持不变。这样的好处是去除了代理者中和被代理者同样的方法。

猜你喜欢

转载自blog.csdn.net/m0_37602117/article/details/79177659