代理模式

什么是代理模式

为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

假设场景:我现在有一间房子,需要出租,这个时候我会去联系中介帮我出租房子,租客通过中介租赁我的房子。

  • 我就是一个真实对象
  • 中介就是一个代理对象
  • 租客就是调用者

JDK动态代理

真实对象必须实现接口,否则运行时报异常

UserService.java
public interface UserService {
   void addUser();
}
UserServiceImpl.java
public class UserServiceImpl implements UserService {
    @Override
    public void addUser() {
        System.out.println("UserService addUser.....");

    }
}
MyMethodInterceptor.java
public class MyMethodInterceptor implements MethodInterceptor {

    //真实对象
    private Object obj;

    /**
     * 根据真实对象获取代理对象
     * @param obj 真实对象
     * @return  代理对象
     */
    public Object getProxy(Object obj){
        this.obj = obj;
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(obj.getClass());
        enhancer.setCallback(new MyMethodInterceptor());
        return enhancer.create();
    }

    @Override
    public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        System.out.println("进入代理方法逻辑。。。。。。。。。。。");
        System.out.println("调用之前。。。。。。。。。。。");
        Object re=methodProxy.invokeSuper(proxy,args);
        System.out.println("调用之后。。。。。。。。。。。");
        return re;
    }
}
运行
 public static void main( String[] args ){
       //输出代理对象的class文件 在根目录下
        System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");
        MyInvocationHandler myInvocationHandler=new MyInvocationHandler();
        UserService proxyuserService = (UserService) myInvocationHandler.getProxy(new UserServiceImpl());
        proxyuserService.addUser();
 }
运行结果

在这里插入图片描述

Cglib动态代理

ProductService.java
public class ProductService {
    public void addProduct(){
        System.out.println("productService addproduct");
    }
}

运行
public static void main( String[] args ){
       MyMethodInterceptor myMethodInterceptor=new MyMethodInterceptor();
        ProductService ps= (ProductService) myMethodInterceptor.getProxy(new ProductService());
        ps.addProduct();
}
运行结果

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值