设计模式-代理模式

代理模式的定义(应用场景):

1.不直接访问真实的引用目标对象

2.对引用目标对象进行业务扩展

优点:1.不需要目标对象的现有业务逻辑的基础下,对目标对象进行扩展

           2. 解耦

缺点:1.客户端和目标对象之间增加一个代理对象,可能导致请求变慢

           2.导致额外的类生成

           3.增加了系统的复杂性

静态代理:在程序运行前代理类的字节码文件就已经生成

动态代理:1.基于JAVA的反射机制-JDK动态代理

                  2.基于JAVA底层的字节码技术-CGLIB动态代理

//业务接口
public interface IRealTarget {
    void Request();
}

   

//业务逻辑实现
public class RealTarget implements IRealTarget {
    @Override
    public void Request() {
        System.out.println("============RealTarget 业务逻辑中");
    }
}
//静态代理
public class MyProxy implements IRealTarget {

    @Override
    public void Request() {

        this.preRequest();
        new RealTarget().Request();//真实对象
        this.postRequest();

    }

    private void preRequest() {
        //TODO
        System.out.println("==========代理类的前置处理");
    }

    private void postRequest() {
        //TODO
        System.out.println("==========代理类的后置处理");
    }

    public static void main(String[] args) {
        //TEST 1
        new MyProxy().Request();
    }

}

          

package com.cloud.Proxy;

import java.lang.reflect.Proxy;

public class MyProxy implements IRealTarget {

    @Override
    public void Request() {

        this.preRequest();
        new RealTarget().Request();//真实对象
        this.postRequest();

    }

    public void preRequest() {
        //TODO
        System.out.println("==========代理类的前置处理");
    }

    public void postRequest() {
        //TODO
        System.out.println("==========代理类的后置处理");
    }

    public static void main(String[] args) {
        //TEST 1
//        new MyProxy().Request();
        //TEST 2
        IRealTarget realTargetProxy = (IRealTarget) MyProxy.newProxyInstance(new RealTarget());
        System.out.println(realTargetProxy.getClass().getName());
        realTargetProxy.Request();
    }

    //匿名内部类实现 或者 实现InvocationHandler.invoke()
    public static Object newProxyInstance(Object realTarget) {
        return Proxy.newProxyInstance(realTarget.getClass().getClassLoader(), realTarget.getClass().getInterfaces(), (proxy, method, args) -> {
            new MyProxy().preRequest();//前置处理
            Object object = method.invoke(realTarget, args);
            new MyProxy().postRequest();//后置处理
            return object;
        });
    }
}

package com.cloud.Proxy;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class MyProxy implements IRealTarget {
    static {
        System.out.println("====================静态代码块====================");
    }

    @Override
    public void Request() {

        this.preRequest();
        new RealTarget().Request();//真实对象
        postRequest();

    }

    public void preRequest() {
        //TODO
        System.out.println("==========代理类的前置处理");
    }

    public static void postRequest() {
        //TODO
        System.out.println("==========代理类的后置处理");
    }

    public static void main(String[] args) {
        //TEST 1
//        new MyProxy().Request();
        //TEST 2
//        IRealTarget realTargetProxy = (IRealTarget) MyProxy.newProxyInstance(new RealTarget());
//        System.out.println(realTargetProxy.getClass().getName());
//        realTargetProxy.Request();
        //TEST 3
        IRealTarget realTargetProxy = CglibProxy.newProxyInstance(RealTarget.class);
        System.out.println(realTargetProxy.getClass().getName());
        realTargetProxy.Request();
    }

    //JDKProxy:匿名内部类实现 或者 实现InvocationHandler.invoke()
//    public static Object newProxyInstance(Object realTarget) {
//        return Proxy.newProxyInstance(realTarget.getClass().getClassLoader(), realTarget.getClass().getInterfaces(), (proxy, method, args) -> {
//            {
//                System.out.println("====================代码块====================");
//            }
//            new MyProxy().preRequest();//前置处理
//            Object object = method.invoke(realTarget, args);
//            postRequest();//后置处理
//            return object;
//        });
//    }

}

//CGLIB:实现MethodInterceptor.intercept()
class CglibProxy implements MethodInterceptor {

    public static <T extends IRealTarget> IRealTarget newProxyInstance(Class<T> targetClazz) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(targetClazz);
        enhancer.setCallback(new CglibProxy());
        return (IRealTarget) enhancer.create();
    }

    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        new MyProxy().preRequest();//前置处理
        Object object = proxy.invokeSuper(obj, args);
        MyProxy.postRequest();//后置处理
        return object;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值