1.什么是代理?
比如:代理,中介,商家等
例如有一家美国的大学,可以对全世界招生,留学中介(代理)
留学中介(代理):帮助这家美国的学校的学校招生,中介是学校的代理,中介是代替学校完成招生的功能。
代理特点:
- 中介和代理他们要做的事情是一致的:招生
- 中介是学校的代理,学校是目标。
- 家长–中介(学校介绍,办理入学手续)-----美国学校。
- 中介是代理,不能白干活,需要收取费用。
- 代理不会让你访问到目标。
为什么找中介?
- 中介是专业的,方便
- 家长现在不能去找学校,家长没有能力访问学校,或者美国的学校不接受个人来访。
- 买东西都是商家卖,商家是某个商品的代理,你个人买东西,肯定不会让你接触到厂家的。
2.实际开放中
也会有这样的情况,你有a类,本来是调用c类的方法,完成某个功能,但是c不让a调用。
a--------不能调用c的方法,在a和c之间创建 b代理,c让b访问,a—>访问b---->访问c,实际的例子,登录注册有验证码,验证码是手机短信。中国移动,联通能发短信。
中国移动,联通能有子公司,或者关联公司,他们面向社会提供短信的发送功能,张三项目发送短信------>子公司,或者关联公司--------->中国移动,联通发短信
3.使用代理模式的作用
- 功能增强:在你原有的功能上,增加了额外的功能,叫做功能增强
- 控制访问:代理类不会让你访问目标
4.实现代理的方式
**4.1.静态代理:**1)代理类是自己手工实现的,自己创建一个Java类,表示代理类
2)同时你所要代理的目标类是确定的。
特点:1)实现简单 2)容易理解
缺点:当你的项目中,目标类和代理类很多的时候,有以下的缺点
1)当目标类增加了,代理类可能需要成倍的增加,代理类数量过多
2)当你的接口增加了,或者修改了,会影响众多的实现类,厂家类,代理类都需要进行更改,影响比较多。(耦合性比较高)
例如:模拟一个用户购买U盘的行为,用户是客户端类,商家是代理,代理某个品牌的U盘,厂家是目标类
三者关系:用户(客户端)---->商家(代理)------->厂家(目标)
商家和厂家都是卖U盘,他们完成的功能是一致的
实现步骤:1.创建一个接口,定义卖U盘的方法,表示你的厂家和商家的事情
2.创建一个厂家类,实现1步骤的接口
3.创建商家,就是代理类也要实现1步骤的接口
4.创建客户端类,调用商家的方法买一个U盘
代理类完成的功能:1.目标类中的方法的调用
2.功能增强
4.2.动态代理
在静态代理中目标类很多的时候,可以使用动态代理,避免静态代理的缺点,动态代理中目标即使很多,1)代理类数量可以很少,2)当你修改了接口中的方法是,不会影响代理类
动态代理:在程序执行过程中,使用Jdk的反射机制,创建代理对象,并动态的指定要代理目标类
换句话说:动态代理是一种创建java对象的能力,让你不用创建Taobao类,就能创建代理类对象。
在Java中,想要创建对象:
1.创建类文件,java文件编译为class
2.使用构造方法,创建类的对象。
动态代理的实现:1.jdk动态代理(理解):使用java反射包中的类和接口实现动态代理的功能
反射包java.lang.reflect,类里面有三个类:InvocationHandler,Method,Proxy
2.cglib动态代理(了解):是第三方工具库,创建代理对象。原理是继承,通过继承目标类,创建他的子类,在子类
中重写父类中同名的方法,实现功能的修改
因为cglib是继承,重写方法,所以要求目标类不能是final的,方法也不能是final的。比
如mybatis,spring框架中都有使用。
演示操作: