加入收藏 | 设为首页 | 会员中心 | 我要投稿 淮南站长网 (https://www.0554zz.cn/)- 管理运维、图像技术、智能营销、专属主机、5G!
当前位置: 首页 > 站长资讯 > 动态 > 正文

IOT 传感器如何重新定义牲畜监测

发布时间:2021-02-15 16:29:37 所属栏目:动态 来源:互联网
导读:nvoke() 方法有3个参数: Object proxy:代理对象 Method method:真正执行的方法 Object[] agrs:调用第二个参数 method 时传入的参数列表值 invoke() 方法是一个代理方法,也就是说最后客户端请求代理时,执行的就是该方法。代理工厂类到这里为止已经结束

nvoke() 方法有3个参数:

  • Object proxy:代理对象
  • Method method:真正执行的方法
  • Object[] agrs:调用第二个参数 method 时传入的参数列表值

invoke() 方法是一个代理方法,也就是说最后客户端请求代理时,执行的就是该方法。代理工厂类到这里为止已经结束了,我们接下来看第二点:「如何通过代理工厂动态生成代理对象」。

生成代理对象需要用到Proxy类,它可以帮助我们生成任意一个代理对象,里面提供一个静态方法newProxyInstance。

 

以看到和静态代理区别不大,唯一的变动是代理对象,我做了标注:「由代理工厂生产」。

这句话的意思是:「代理对象是在程序运行过程中,由代理工厂动态生成,代理对象本身不存在 Java 源文件」。

那么,我们的关注点有2个:

  • 如何实现一个代理工厂
  • 如何通过代理工厂动态生成代理对象

首先,代理工厂需要实现InvocationHanlder接口并实现其invoke()方法。

 

明来到代理工厂,需要购买一款法国在售的香奈儿香水,那么工厂就会**找一个可以实际的代理对象(动态实例化)**分配给小明,例如小红或者小花,让该代理对象完成小明的需求。「该代理工厂含有无穷无尽的代理对象可以分配,且每个对象可以代理的事情可以根据程序的变化而动态变化,无需修改代理工厂。」

如果有一天小明需要招待一个可以「代购红酒」的代理对象,该代理工厂依旧可以满足他的需求,无论日后需要什么代理,都可以满足,是不是觉得很神奇?我们来学习如何使用它。

我们看一下动态代理的 UML 类图结构长什么样子。

 

OK,事已至此,代码就不重复写了,我们来探讨一下,面对这种新增的场景,上面的这种实现方法有没有什么缺陷呢?

我们不得不提的是软件工程中的「开闭原则」

❝开闭原则:在编写程序的过程中,软件的所有对象应该是对扩展是开放的,而对修改是关闭的❞

静态代理违反了开闭原则,原因是:面对新的需求时,需要修改代理类,增加实现新的接口和方法,导致代理类越来越庞大,变得难以维护。

虽然说目前代理类只是实现了2个接口,**如果日后小红不只是代理售卖红酒,还需要代理售卖电影票、代购日本寿司······**实现的接口会变得越来越多,内部的结构变得越来越复杂,「整个类显得愈发臃肿」,变得不可维护,之后的扩展也会成问题,只要任意一个接口有改动,就会牵扯到这个代理类,维护的代价很高。

「所以,为了提高类的可扩展性和可维护性,满足开闭原则,Java 提供了动态代理机制。」

常见的动态代理实现

动态代理最重要的当然是「动态」两个字,学习动态代理的过程,最重要的就是理解何为动态,话不多说,马上开整。

我们来明确一点:「动态代理解决的问题是面对新的需求时,不需要修改代理对象的代码,只需要新增接口和真实对象,在客户端调用即可完成新的代理。」

这样做的目的:满足软件工程的开闭原则,提高类的可维护性和可扩展性。

JDK Proxy

JDK Proxy 是 JDK 提供的一个动态代理机制,它涉及到两个核心类,分别是Proxy和InvocationHandler,我们先来了解如何使用它们。

以小红代理卖香水的故事为例,香奈儿香水提供商依旧是真实对象,实现了SellPerfume接口,这里不再重新写了,重点是「小红代理」,这里的代理对象不再是小红一个人,而是一个「代理工厂」,里面会有许多的代理对象。我画了一幅图,你看了之后会很好理解:


 

(编辑:淮南站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读