所谓动态署理,指的是语言提供的一种语法,可以或许将对工具中差异要领的挪用重定向到一个统一的处理惩罚函数中来。
python重写__getattr__
函数可以或许做到这一点,就连世界上最好的语言也提供称为把戏要领的__call
。
这种语法除了能更好的实现动态署理外,照旧RPC框架实现道理的一部门。
1. 动态署理是什么
动态署理提供一种抽象,可以或许将工具中差异要领的挪用重定向到一个统一的处理惩罚函数,做自界说的逻辑处理惩罚。
可是对付挪用者,对此毫无察觉,就仿佛挪用的要领是用传统方法实现的一般。
这种语法,在java中被称为动态署理。之所以叫做动态署理,是因为它能制止传统署理模式实现中人工一个一个的将java函数转发已往,
而是可以或许让代码自动做到这一点,这样署理类的代码是和业务无关的,不会因为业务类的要领增多而逐渐复杂。
使代码更易维护更易修改,实现自动化搬砖。
实际上,被署理的类不必然位于本机类,动态署理语法提供了一种抽象方法,被署理的类也可以位于长途主机上,这也是RPC框架实现道理的一部门。
领略了动态署理的观念后不难发明,动态署理观念上有着这么几个部门:
2. java动态署理机制
领略了观念,就不难领略java动态署理的机制了。下面来看看java动态署理机制如何署理一个当地工具。
2.1. 署理接口
首先看第一个部门,给挪用者利用的署理类。在java动态署理机制中,昆山软件公司,这个脚色只能是接口。我们界说一个整数运算接口:
interface NumberOperationInterface { int add(int a, int b); }
2.2. 署理处理惩罚器
再看第二个脚色,昆山软件开发,统一的处理惩罚函数。在java中它简直是类,通过实现InvocationHandler
接口界说。
class NumberOperationImpProxyHandler implements InvocationHandler { private Object proxied; public RealObjectProxyHandler(Object proxied) { this.proxied = proxied; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.printf("挪用函数%s\n", method.getName()); return method.invoke(proxied, args); } }
invoke
函数中,对署理工具的所有要领的挪用都被转发至该函数处理惩罚。在这里可以机动的自界说各类你能想到的逻辑。在上面的代码中,我们利用反射挪用被署理工具的同名要领实现。2.3. 被署理类
由于我们的示例是署理当地工具,因此还需要一个被署理工具的类:
class NumberOperationImp implements NumerOperationInterface { @Override public int add(int a, int b) { return a + b; } }
2.4. 建设署理工具
好了,各个构成部门都界说完成。此刻把它们组合起来:
public NumerOperationInterface wrap(NumerOperationInterface proxied) { return (NumerOperationInterface) Proxy.newProxyInstance( NumerOperationInterface.class.getClassLoader(), new Class[]{NumerOperationInterface.class}, new NumberOperationImpProxyHandler(proxied)); }
Proxy.newProxyInstance
要领可以或许按照提供的接口和署理处理惩罚器建设署理工具。java提供的写法太烦琐了,可以思量利用Guake提供的帮助函数简化下代码。如下:
public NumerOperationInterface wrap(NumerOperationInterface proxied) { return Reflection.newProxy(NumerOperationInterface.class, new NumberOperationImpProxyHandler(proxied)); }
好了,此刻挪用下试试:
NumerOperationInterface proxied = new NumberOperationImp(); real = wrap(proxied); real.add(1, 2);
2.5. 总结
动态署理听起来是署理模式的动态实现,但是团结上面的最终结果,不以为这个叫做动态装饰器更符合吗?
3. 动态署理的应用