Java设计模式 - 静态代理和动态代理

代理模式(proxy pattern)

定义

被代理类对象的方法调用交给了代理类来调用。

特点

1.静态代理类把接口写死,只能代理实现了代理类接口的被代理类。
2.动态代理利用了反射方法实现拥有不同接口的被代理类的代理。

一般写法

用代理2个类来体会下静态代理和动态代理的优缺点。

public interface MyInterface1 {
    String print1();
}
public interface MyInterface2 {
    String print2();
}
/**
 * 被代理类1
 */
public class MyClass1 implements MyInterface1 {
    @Override
    public String print1() {
        return "1";
    }
}
/**
 * 被代理类2
 */
public class MyClass2 implements MyInterface2 {
    @Override
    public String print2() {
        return "2";
    }
}

静态代理工厂

/**
 * 静态代理工厂
 * 相较于动态代理工厂 {@link ProxyFactory},接口写死了,
 * 只能代理实现了{@link MyInterface1}的类
 */
public class Class1ProxyFactory implements MyInterface1 {
    private MyInterface1 myInterface1;

    // 把被代理类传进来
    public Class1ProxyFactory(MyInterface1 myInterface1) {
        this.myInterface1 = myInterface1;
    }

    @Override
    public String print1() {
        return myInterface1.print1();
    }
}

动态代理工厂,利用了反射

import java.lang.reflect.Proxy;

/**
 * 动态代理工厂类
 */
public class ProxyFactory {
    /**
     * 获取代理类对象
     *
     * @param object 被代理对象
     * @return 代理类对象
     */
    public static Object getProxyInstance(Object object) {
        MyInvocationHandler myInvocationHandler = new MyInvocationHandler();

        // 把被代理对象进行绑定
        myInvocationHandler.bind(object);

        // 此处利用了反射的方法
        return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), myInvocationHandler);
    }
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class MyInvocationHandler implements InvocationHandler {
    private Object object;

    /**
     * 用于绑定被代理类对象
     *
     * @param object 被代理类对象
     */
    public void bind(Object object) {
        this.object = object;
    }

    @Override
    public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
        return method.invoke(object, objects);
    }
}

测试结果

/**
 * 测试
 */
public class Main {
    public static void main(String[] args) {
        MyClass1 myClass1 = new MyClass1();
        MyClass2 myClass2 = new MyClass2();

        // 动态代理,可代理实现不同接口的类
        // 通过被代理对象获取代理对象,进而代理对象可以调用到被代理对象的方法
        MyInterface1 proxyInstance1 = (MyInterface1) ProxyFactory.getProxyInstance(myClass1);
        System.out.println(proxyInstance1.print1());

        MyInterface2 proxyInstance2 = (MyInterface2) ProxyFactory.getProxyInstance(myClass2);
        System.out.println(proxyInstance2.print2());

        // 静态代理
        Class1ProxyFactory class1ProxyFactory = new Class1ProxyFactory(myClass1);
        System.out.println(class1ProxyFactory.print1());
    }
}
1
2
1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值