IOT 传感器如何重新定义牲畜监测
nvoke() 方法有3个参数:
invoke() 方法是一个代理方法,也就是说最后客户端请求代理时,执行的就是该方法。代理工厂类到这里为止已经结束了,我们接下来看第二点:「如何通过代理工厂动态生成代理对象」。
生成代理对象需要用到Proxy类,它可以帮助我们生成任意一个代理对象,里面提供一个静态方法newProxyInstance。 以看到和静态代理区别不大,唯一的变动是代理对象,我做了标注:「由代理工厂生产」。 这句话的意思是:「代理对象是在程序运行过程中,由代理工厂动态生成,代理对象本身不存在 Java 源文件」。 那么,我们的关注点有2个:
首先,代理工厂需要实现InvocationHanlder接口并实现其invoke()方法。 明来到代理工厂,需要购买一款法国在售的香奈儿香水,那么工厂就会**找一个可以实际的代理对象(动态实例化)**分配给小明,例如小红或者小花,让该代理对象完成小明的需求。「该代理工厂含有无穷无尽的代理对象可以分配,且每个对象可以代理的事情可以根据程序的变化而动态变化,无需修改代理工厂。」 如果有一天小明需要招待一个可以「代购红酒」的代理对象,该代理工厂依旧可以满足他的需求,无论日后需要什么代理,都可以满足,是不是觉得很神奇?我们来学习如何使用它。
我们看一下动态代理的 UML 类图结构长什么样子。 OK,事已至此,代码就不重复写了,我们来探讨一下,面对这种新增的场景,上面的这种实现方法有没有什么缺陷呢? 我们不得不提的是软件工程中的「开闭原则」 ❝开闭原则:在编写程序的过程中,软件的所有对象应该是对扩展是开放的,而对修改是关闭的❞ 静态代理违反了开闭原则,原因是:面对新的需求时,需要修改代理类,增加实现新的接口和方法,导致代理类越来越庞大,变得难以维护。 虽然说目前代理类只是实现了2个接口,**如果日后小红不只是代理售卖红酒,还需要代理售卖电影票、代购日本寿司······**实现的接口会变得越来越多,内部的结构变得越来越复杂,「整个类显得愈发臃肿」,变得不可维护,之后的扩展也会成问题,只要任意一个接口有改动,就会牵扯到这个代理类,维护的代价很高。 「所以,为了提高类的可扩展性和可维护性,满足开闭原则,Java 提供了动态代理机制。」 常见的动态代理实现 动态代理最重要的当然是「动态」两个字,学习动态代理的过程,最重要的就是理解何为动态,话不多说,马上开整。 我们来明确一点:「动态代理解决的问题是面对新的需求时,不需要修改代理对象的代码,只需要新增接口和真实对象,在客户端调用即可完成新的代理。」 这样做的目的:满足软件工程的开闭原则,提高类的可维护性和可扩展性。 JDK Proxy JDK Proxy 是 JDK 提供的一个动态代理机制,它涉及到两个核心类,分别是Proxy和InvocationHandler,我们先来了解如何使用它们。
以小红代理卖香水的故事为例,香奈儿香水提供商依旧是真实对象,实现了SellPerfume接口,这里不再重新写了,重点是「小红代理」,这里的代理对象不再是小红一个人,而是一个「代理工厂」,里面会有许多的代理对象。我画了一幅图,你看了之后会很好理解: (编辑:淮南站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |