代理模式ing

代理模式:什么是代理模式?代理模式其实在我们生活当中是一种很常见的模式

比如:

        现在有三个角色:消费者、商家、厂家;现在消费者想要购买商品,此时消费者就会去找商家购买自己所需要的商品;商家有商品,就把消费者所需要的商品买给消费者;商家在商品售卖完后,就会找厂家进货,补充所需要的商品;此时消费者、商家、厂家之间就存在了一种代理关系;商家就是厂家的代理商,因为对于厂家来说,他肯定不愿意自己去买商品,因为他自己去买,第一成本高,第二日出量少,收入也就低了;所以此时厂家就需要一个代理商,来帮助它来买它的商品,而此时商家就是厂家的代理商,然后消费者就可以直接去找到商家然后购买到自己想要的商品了;在这里,商家与厂家就存在一种代理关系(商家就是厂家的代理)

在比如说:

        现在同样是有三个角色:消费者,淘宝,厂家,同样也是购买商品;对于厂家来说,厂家现在生产了一大批商品,此时商家肯定就想要把生产的商品都全部卖掉,因为对于厂家来说,要是卖不掉,不仅赚不到钱,可能还还亏一大笔钱,那这对于厂家来说这就是一笔很大的损失;但是对于厂家来说,他自己又不可能一个一个的去买,因为目前厂家生产了一大批货,对于厂家来说他自己一个一个的去买,不仅时间要得久不说,而且成本还高(一个地方肯定卖不完厂家生产的东西,那厂家为了买完自己生产的商品,就只有去其它地方去买,去其它地方去买,肯定就要增加成本,而且还增加风险);此时厂家,深信一句话:"专业的事情,还需要专业的人来做",既然买商品不是厂家的专业,那就找一个专业的人,而此时淘宝,就是一个非常专业的买商品平台,所以厂家就找到淘宝平台,然后跟淘宝谈合作,希望淘宝能够帮助厂家买掉他们的商品;此时淘宝就是厂家的代理,但是对于淘宝来说它不可能白干事,不收钱,所以此时淘宝就会跟厂家商量,比如现在厂家一件货品是只卖15元,淘宝肯定也要生活,也要赚钱,那淘宝肯定就要在这个15员的基础上在增加一定的费用比如85元/件,而且对于淘宝来说,既然他成为了代理了,承担了这个买商品的风险,那对于淘宝来说,他就肯定就不想消费者在能够直接找到厂家,然后从厂家哪里卖商品了,所以此时淘宝就要跟厂家商量,签订合同,说你不能让消费者在在你这里买东西了,就算买,也得以我买的价格买甚至更高才行,否则我就不做你的代理商,不帮你买东西了,厂家此时肯定就虚呀,那就只能连连答应;

所以这个关系就是代理模式:

代理模式的作用:

                1.控制访问:控制消费者直接访问商家

                2.调用目标类的方法:原价15元的基础上

                3.功能增强:在原价15元的基础上,增加到85元,甚至还会满多少还多少消费卷.....

我们现在知道了什么是代理模式,我们现在就用代码来实现代理模式:

代理模式又分为静态代理和动态代理

静态代理:

1.0 首先我们先创建一个商家和厂家都有的售卖商品的动作的公共接口

2.0 建立厂家类

厂家商品单价为15元,厂家要买商品,此时肯定就必须得找代理商

3.0 创建代理类

 (注:我们使用代理模式,其实最主要的目的,就是在原有的方法上,进行功能增强)

4.0 新建消费者测试类

在原有的基础上进行了功能增强了,这就是代理

不过静态代理,也有很多弊端,比如现在对于厂家来说,感觉一个代理商不能满足它卖货速度的需求,所以厂家为了满足自己的需求,就派出他们的市场专员,然后去找更多的代理商;映射到代码里面,就需要在写更多的代理类,比如:京东代理类

京东代理类

在比如厂家感觉还不满足,还需要更多的代理商,那按照静态代理模式,则需要对每个代理类,在单独的写一个类;1.这样的话就产生了大量的代理类;其次,假设此时,我对公共买商品接口,在添加一个方法,比如就一个简单的输出方法

2. 在增加了一个简单的方法后,我们可以看到,此时则需要我们对:目标类及其所有的代理类,都需要进行修个才行,这种改动量是非常大的,而且代码是非常冗余的;所以在这基础上为了解决这些问题,便有了动态代理

5.0 动态代理

动态代理简单点说就是:在程序的运行的过程中,动态的帮我们创建代理对象,动态代理是一种创建对象的能力;动态代理又分为jdk动态代理和cglib动态代理

5.1 jdk动态代理

jdk动态代理:java利用jdk反射机制,帮我们动态的创建代理对象,要使用jdk动态代理,目标对象必须是实现了接口的类

要掌握jdk动态代理,首先必须认识jdk反射包中三个核心的类

1. InvocationHandler接口

InvocationHandler接口里有一个方法invoke(),在这个方法里面来实现我们的代理增强

这个接口主要功能就是实现我们的代理功能增强

2. Method对象

在这个对象中也有一个invoke()方法,但是这个方法跟InvocationHandler接口中的invoke()方法没有任何关系,只是正好同名,Method.invoke()方法的作用是执行目标方法

这个方法的作用就是调用执行目标方法对象

3. Proxy

帮我们创建代理对象;在Proxy中有一个静态方法:newProxyInstance()

 Proxy.newProxyInstance()通过静态方法帮我们创建代理对象;下面我们来通过jdk动态代理创建代理对象,实现代理增强

4. 首先我们自定义一个类实现InvocationHander接口

5. 然后我们在写一个测试类,来实现创建我们的代理对象,实现功能增强

5.2 CGLIB动态代理

cglib动态代理,是对jdk动态代理的一种补充,cglib动态代理是以继承的方式来创建代理对象,实现代理增强;注:因为cglib是以继承的方式来实现代理增强的,所以目标类对象不能用final修饰,目标方法也不能使用final修饰

cglib是由第三方提供的,不是java自带的,所以我们在使用cglib动态代理,第一步需要导入cglib的包

5.2.0 cglib的包

<dependency>
    <groupId>cglib</groupId>
    <artifactId>cglib-nodep</artifactId>
    <version>3.2.4</version>
</dependency>

5.2.1 创建我们自己的方法拦截器

 5.2.2 写测试类

 

最后看一下cglib底层生成的代理对象

在这里我们可以直接的看到,cglib底层是通过继承的方式来生成代理对象,实现代理增强,既然继承了目标方法,那么在代理对象中肯定也重写了目标方法

将我们自定义的方法拦截器,赋值给代理对象,然后在代理对象中,代理对象调用我们自定义的方法拦截器,实现我们的功能增强

注:我这篇文章还是有很多地方没有讲到:比如jdk的底层生成的代理对象(源码对象)是怎样的,还有cglib中各个方法的作用,感兴趣的读者,建议下来在多看一下其它博主的文章

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值