这三种设计模式在代码形式上十分相似。但是为了解决不同的问题而提出的:
成都创新互联公司专注于定南企业网站建设,响应式网站设计,商城网站建设。定南网站建设公司,为定南等地区提供建站服务。全流程按需定制制作,专业设计,全程项目跟踪,成都创新互联公司专业和态度为您提供的服务
静态代理的问题: 当我们有非常多实现了不同接口的类需要被代理的时候,静态代理的方式就显得非常麻烦。我们需要给每个被代理类实现相同的代理逻辑,但代码大多数都是重复的,我们可以使用反射进行动态代理来解决这一问题。
动态代理Java实现
我们需要实现InvocationHandler
接口。
private class DynamicProxyHandler implements InvocationHandler {
private Object proxiedObject;
public DynamicProxyHandler(Object proxiedObject) {
this.proxiedObject = proxiedObject;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Th
long startTimestamp = System.currentTimeMillis();
Object result = method.invoke(proxiedObject, args);
long endTimeStamp = System.currentTimeMillis();
long responseTime = endTimeStamp - startTimestamp;
String apiName = proxiedObject.getClass().getName() + ":" + method.getNam
RequestInfo requestInfo = new RequestInfo(apiName, responseTime, startTim
metricsCollector.recordRequest(requestInfo);
return result;
}
}
实现完成后,将这个实现,以及被代理类的类加载器、被代理类的接口一同传入Proxy
类的静态方法newProxyinstance
中,就可以动态的创建代理类了。
public static Object newProxyInstance(ClassLoader loader, Class>[] interfaces, InvocationHandler h)
简单来说,就是定义一个适配器接口,并继承需要被适配的类,然后实现适配器接口的相应方法。在实现接口的方法时,我们只需要实现那些需要被改造的旧接口,对于符合要求的旧接口,可以继续沿用父类方法。(因此,如果需要适配的对象接口很多,并且和新接口定义大部分都相同,那么可以直接使用基于类的实现)
基于实现的方法,是将被适配的类注入进来,再进行相应改造的方式。相较基于类的方式,更灵活。如果新旧接口存在较多的不一致,推荐使用基于实现的方式,会更加灵活。
比如slf4j就是一套统一不同底层日志包的接口。此外,考虑到不同日志包的api存在的不同,slf4j还提供了相应的适配器,来统一api管理。