谈谈我对代理模式的理解

多读多写多记录,多学多练多思考。----------- Banana • Banuit Gang(BUG香柚帮)


  谈到设计模式,有人看到大篇的理论概念什么的,总是把它想得很神秘,很难理解的样子,大香蕉去理解一个东西,也是不喜欢看那些概念性的东西,不但不容易记忆,还难以理解,所以我总是喜欢把一些抽象的概念问题转化为我们生活中的实际问题来加以分析,这样的话就比较通俗易懂,而且记得牢固,不容易忘记,这应该也算是Java的面向对象思维吧,万事万物皆对象,分析一个问题时,首先看问题里边有哪些对象,然后看对象都有哪些属性,最后就是分析对象和对象之间的关系。

 今天我们要说的是设计模式中的代理模式,而代理模式又分为静态代理和动态代理,下面分析两个问题:

  1. 什么是代理模式?
  2. 静态代理和动态代理的区别?

先放出来三个概念,抽象角色,真实角色和代理角色:

  • 抽象角色:通过接口或抽象类声明真实角色实现的业务方法
  • 真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用
  • 代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作

  首先我们先来看看第一个问题,什么是代理模式呢?代理代理这个词汇大家并不陌生,也并不难理解,从字面意思都能想到是什么意思,好比说我作为一个消费者(抽象角色),我(真实角色)本来要去做一件事情,比如想要一把椅子,于是我委托给了木匠(代理角色)帮我做把椅子,而这个木匠在做我的椅子的前边和后边的时间还可以去做别的事情,只要保证把我的椅子做好就行了。这其实就是代理模式的过程,并没有那么难以理解。

  接下来就是静态代理和动态代理的区别?比如说今天我又想要做一款游戏,于是我委托给了你这个程序猿,你做我这个游戏的时候还可以去做其他项目,只要保证给我的游戏做好就行,这就是一种静态代理模式,在这种代理模式中,我每做一件不同的事情,就要找到相对应会做这件事情的人,也就是说需要一个真实角色对应一个代理角色,这样在实际开发中,大量使用静态代理会使类急剧增加,为了解决这个问题,因此出现了动态代理,动态代理的代理角色就好像一个大型的服务商,当我想要一把椅子或做一款游戏,我只需要去找这个服务商就行,由它根据我的需求动态的去寻找相对应做这件事情的人。

静态代理是代理角色实现了抽象角色,而动态代理只需要代理角色实现InvocationHandler接口,然后调用invoke方法,根据目标对象,动态生成代理角色。

/**
 * 动态代理类
 * @author Banana
 */
public class MyInvocationHandler implements InvocationHandler {
 
    private Object target;
 
    MyInvocationHandler(Object target) {
        super();
        this.target = target;
    }
 
    /**
     * @Title: 调用方法之前的操作
     */
    public void doBefore() {
        System.out.println("---------doBefore()----------");
    }
 
    /**
     * @Title: 调用方法之后的操作
     */
    public void doAfter() {
        System.out.println("---------doAfter()----------");
    }
 
    //封装了代理类的具体操作,在代理类中动态实现
    //第一个参数obj一般是指代理类,method是被代理的方法,args为该方法的参数数组。
    @Override
    public Object invoke(Object obj, Method method, Object[] args) throws Throwable {
        doBefore();
        Object result = method.invoke(target, args);
        doAfter();
        return result;
    }
 
}

 

/**
 * 动态代理测试类
 * @author Banana
 */
public class DynamicProxy {
 
    public static void main(String[] args) {
        BananaService bananaService = new BananaServiceImpl();
        MyInvocationHandler myInvocationHandler = new MyInvocationHandler(bananaService);
        BananaService bananaServiceProxy = (bananaService) Proxy.newProxyInstance(bananaService.getClass().getClassLoader(), bananaService.getClass().getInterfaces(),
                        myInvocationHandler); //返回代理类的一个实例,返回后的代理类可以被当作真实角色使用,可使用真实角色中申明的方法
        bananaServiceProxy.getGame();
    }
 
}

补充:
  动态代理被用在了很多地方,而我们最熟悉的就是Spring AOP,面向切面编程,想要理解Spring AOP,首先要先理解动态代理,Spring AOP中用到了JDK动态代理和CGLIB动态代理,他俩的区别就在于JDK动态代理需要实现接口。

Spring AOP:其实是对面向对象思维的一个扩展和补充。

作用:可以动态的添加或删除在切面上的逻辑而不影响原有代码的执行。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值