代理模式

代理模式实际上就是代理类帮助真实类执行它的方法,并且可以加上一些其他操作。代理模式有静态代理和动态代理。JDK中提供了实现动态代理的功能。

接口和真实类

接口

public interface ProxyInterface {
    void doSomething();
    void sleep();
}

真实类

public class RealObject implements ProxyInterface{
    @Override
    public void doSomething() {
        System.out.println("RealObject doSomething...");
    }
    @Override
    public void sleep() {
        System.out.println("RealObject sleep...");
    }
}

静态代理

代理类

public class StaticProxy implements ProxyInterface{
    private final RealObject realObject = new RealObject();
    
    @Override
    public void doSomething() {
        System.out.println("start1");
        realObject.doSomething();
        System.out.println("end1");
    }

    @Override
    public void sleep() {
        System.out.println("start2");
        realObject.sleep();
        System.out.println("end2");
    }
}

静态代理功能测试

public class TestStaticProxy {
    public static void main(String[] args) {
        StaticProxy staticProxy = new StaticProxy();
        staticProxy.doSomething();
        staticProxy.sleep();
    }
}

动态代理

public class ProxyHandler implements InvocationHandler {
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        if (method.getName().equals("doSomething")) {
            System.out.println("start1");
            // 反射执行真实类对象的方法
            method.invoke(new RealObject(), args);
            System.out.println("end1");
        }
        else if (method.getName().equals("sleep")) {
            System.out.println("start2");
            method.invoke(new RealObject(), args);
            System.out.println("end2");
        }
        return null;
    }
}

动态代理功能测试

public class TestProxy {
    public static void main(String[] args) {
        // 生成代理对象
        ProxyInterface proxy = (ProxyInterface) Proxy.newProxyInstance(ProxyInterface.class.getClassLoader(), new Class[]{ProxyInterface.class}, new ProxyHandler());
        // 代理对象在帮RealObject执行它的方法,并增加一些操作
        proxy.doSomething();
        proxy.sleep();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值