(Java)Java中的静态代理

Java中的静态代理

由于最近在看Spring方面的资料,了解到面向切面编程,逐渐知道其背后的含义与代理模式有几分相似,当然代理模式也不是仅仅Java独有,这是一种思维模式不局限于是哪种语言!

所以最近两篇博客咱们就来一起学习一下Java中的代理模式,今天就来说说这个静态代理。

说到这小伙伴们就要问了,为啥子要使用代理模式呢?我们直接了当去做不是更好吗?

好小杰下面就来告诉大家:微笑

什么是代理模式?

为什么要使用代理模式?

怎么使用代理模式?

##先说第一个,什么式代理模式?

    -代理代理就是代理你去做一些事情,结合我们代码来说就是这一块代码就做连接数据库的事儿,多余的其他事情我都不关心,都去交给代理类去做,我就连接数据库进行CRUD。

##为什么要用代理模式?

针对于上面那个例子来说,比如我们在进行CRUD之前我们是否有必要去验证一下参数的合法性、是否需要在执行CRUD之前与之后打印一下日志?就拿验证参数这个环节来说,如果你既做CRUD又去验证参数,这样的话代码显得臃肿不好维护不说,整个架构的意义也容易发生变更。所以为了避免上面的禁忌以及其他方面的不足,我们可以考虑通过代理类去对参数进行验证.然而真正处理CRUD的方法就只是处理。一旦参数合法再由代理类发起通知来调用你。这样不仅层次分明而且你还可以在代理类中添加其它属性与方法来增强目标类(指的就是只干某一进事情的类(被代理类,本例中就指仅干CRUD的那个方法所在的类))。

##怎么使用代理模式?

由于此篇关注静态代理所以代理模式的使用讲的也是静态代理的使用方式。

1.首先被代理类要去实现特定的接口。

2.代理类也去实现这个接口。

3.在被代理类中写主要的方法逻辑

4.在代理类中进行被代理类的增强与参数验证等其它琐碎工作。

=>口说无凭,咱们通过代码来直观感受一下(一步一步的来)。

首先和以前一样我们新建一个工程这次就不建动态工程了,因为没有必要所以直接建一个普通的Java工程(模拟一下)。工程目录如下:


项目背景:

    咱们开发了一个论坛,我们的论坛有几种人?两种人一种是登录成功的用户,另一种是尚未登录的游客,既然身份不同,那我们授予他们的权限也自然不能相同,那这个对权限判定我们该怎么来完成呢?

其实通过静态代理就可以来搞一下。

需求分析:

    ##原来是controller层接收的请求直接转给Service进行处理再返回给controller但是我们这次使用静态代理,请看分析:

    1. controller接收请求

    2.将请求转交给service的代理类(进行登录人员的验证与被代理类的增强)

    3.如果代理类验证成功=>用户登录完成,就调用service允许该用户评论与开放其它功能,

       如代理类验证失败=>此时用户身份为游客仅开放浏览功能。

来,上代码

先在dao层中创建一个关于评论的接口


下面我们让一个关于评论的service类去实现这个接口(此类就是目标类也是被代理类)


在service中新建一个代理类也去实现那个关于评论的接口


下面我们搞一下查询数据库人员登录情况的类与方法

->实体类


->查询数据库中人员登录状况的接口


->查询接口的实现类(这里由于未连接数据库所以我们通过随机数来模拟可能出现的状况)


下面就是该丰富代理类了,请看代码!


别慌,上面的逻辑很简单就是调用了一下dao层的查询登录人员状态的接口的实现类中的方法来获取查询的结果,再根据这个结果来判定人员的登录状况(游客还是登录过的用户)来为他们赋予不同的权限,由此便实现了咱们开头说的权限的划分;if语句中的功能方法下面贴出:



来,上面的流程我们都说清楚了,剩下的就是controller层接收请求了,来模拟一下。


我们将获取到的请求转交给代理类 ...

来跑起来:



总结一下:

    静态代理:

    -必须被代理类与代理类都去实现相同的接口因为彼此存在着关联关系。

    -通过上面的静态代理给我们最直观的感受就是被代理类似乎都不知道发生了什么就已经实现了对用户权限的划分以及对自己的增强(指的就是代理类中的那些颜色方法、提问方法、等游客享受不了的方法)。而被代理类就只管执行评论功能 ...

    -这样一来既没有干扰三层架构的意义与结构,同时又实现了对用户权限的划分以及对目标类(被代理类的增强)。

这一章节的静态代理就先诉说到这,由于本人也是最近才接触到这种模式难免有些疏忽或者理解有问题的地方,还希望大家指正。谢谢大家,一起进步。

















猜你喜欢

转载自blog.csdn.net/qq_39872652/article/details/80744922