Java—代理


——————————————————————————————

先举一个例子:

有一个转账的类:

public class 转账{
    public void 转账 (int num,String A,String B){
        System.out.println(A+"给"+B+"转账"+num);
    }
}

**转账操作:**转账之前需要验证A和B的身份,转账操作、转账之后需要对数据库金额进行改变
将上面三个逻辑写在一个方法当中是不可行的——》在实践过程当中,最好只能对应一个逻辑——》1.调用验证方法 2.调用转账方法 3.操作数据库
为什么实践过程中,一个方法最好只能对应一个逻辑??
——》原因:方法的使用:如果一个方法当中对应这多个逻辑,那么会造成该方法的冗余,一旦条件发生变动,那么对于该方法的改变工程量巨大

开闭原则

例:登录
在这里插入图片描述
如果要新加一个 功能:判断权限(区分管理员和数据库)
-----!!!重新写代码是不可以的(不能在原有的代码基础上进行改变)
原因:违反了程序的设计原则(设计原则【开闭原则】:一个方法对应一个逻辑,已经写好的代码不能进行改变,原因在于调用该方法的代码可能有很多 ,一旦进行改动,那么就会牵一发而动全身)
【开闭原则:程序对访问开放,对修改关闭】
在这里插入图片描述
------可行的方法:
新写代码:写新的类,验证的servlet让用户进行调用
调用的逻辑:调用验证servlet——>调用LoginServlet

什么是代理

代理类控制着对目标类的访问
在这里插入图片描述
在代理当中,login当中的登录方法是不会被直接调用的

两种调用的方式:

第一种,传统的方式,调用登录方法,再进行验证
第二种,直接插入进去,调用方法的时候,验证也就进行了
实际当中用的第二种方式比较多,因为第一种方式比较冗余
在这里插入图片描述

代理定义:

代理定义: 给目标对象提供一个代理对象,并且由 目标对象 控制着对 代理对象 的引用
在传统的方法当中 ——登陆对象和验证对象是相互独立的,从下边的实际案例当中可以看出一个问题,就是用户可以只进行验证不进行登录,或只进行登录不进行验证
在代理方式中 ——在 代理验证 对象当中有loginServlet,我们在调用代理验证对象的login()方法,就一定会执行验证方法
原因在于:代理对象(d)控制着我们对目标对象(loginServlet)的引用
在这里插入图片描述

代理的实现方式

静态代理

静态代理——>一个代理类 代理一个目标类(也可以表述为:一个代理对象控制着一个目标对象)
代理类可以生成代理对象,目标类可以生成目标对象
在这里插入图片描述

代理的目的:

  1. 控制访问: 通过代理对象的方式 间接 去访问目标对象,防止可以直接访问目标对象给系统代理不必要的复杂性
    使用代理,可以让用户想使用目标对象,必须先使用代理对象
    在这里插入图片描述
  2. 功能增强: 通过代理类能够对原有业务进行增强
    在这里插入图片描述

如何让程序知道要增强的功能是谁?

1、接口方式: 通过实现接口的方式知道哪个是要增强的功能
在这里插入图片描述
在这里插入图片描述

静态代理缺点:

静态代理缺点: 静态代理不可以用一个代理类来代理多个目标类,因为违反开闭原则

动态代理

真实被代理的都是由目标类所代理的目标对象

什么是动态代理

动态代理:由动态代理类生成多个代理对象来代理不同的目标类
在这里插入图片描述

动态代理的实现

如何生成不同的代理对象??——>反射
1、确定目标类 (静态代理可以直接确定代理类代理的是哪个对象,但是动态代理类不能直接确定)
—>所以使用object
代理的目标对象由用户直接决定
在这里插入图片描述
在这里插入图片描述
2、功能的增强

  • 1.实现接口,明确要增强的方法

如何实现接口?

实现接口在动态代理当中不能使用implement去实现,要用jdk给我们提供的方法去实现接口,并生成代理对象

因为每次新增一个目标对象就要新增一个接口的话是不理智的
在这里插入图片描述
getInterface返回结果是代理对象

  • 2.明确需要功能增强的方法(方法的调用)------jdk提供了一个接口InvocationHandler
    实现接口,那么接口当中所有的方法都要实现
    在这里插入图片描述
  • invoke方法三个参数: (这三个参数不需要赋值)
    • proxy:object类型
    • method:我们通过反射获取到的目标对象当中,需要增强功能的方法
    • args:该方法的参数
      在这里插入图片描述
      上面:通过反射调用目标类的方法
      上面这两个方法名是一样的,但是代表的意义不一样

静态代理和动态代理的区别

静态代理:

在静态代理类当中,如果新增一个目标类,那我们需要在静态代理类当中创建新增的目标类对象,这样会违反开闭原则。
(下面这样不可行)
在这里插入图片描述
(下面这样可行)
在这里插入图片描述
如果采用新增代理对象的同时也新增代理类——>不可行(理论可行但不现实)
——>所以让一个类生成不同的代理对象来代理不同的目标对象

动态代理:

由动态代理类生成多个代理对象来代理不同的目标类
在这里插入图片描述
代理对象A代理目标对象A,能不能让代理对象A代理目标对象B
—> 答:不可行
—> 原因:代理对象和目标对象之间是有一对一的关联性的
体现在哪里?
—> 体现在代理对象要对目标对象的业务进行增强。代理对象一定要实现目标对象的接口
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值