這三種設計模式在代碼形式上十分相似。但是為了解決不同的問題而提出的:
成都創(chuàng)新互聯(lián)公司專注于定南企業(yè)網站建設,響應式網站設計,商城網站建設。定南網站建設公司,為定南等地區(qū)提供建站服務。全流程按需定制制作,專業(yè)設計,全程項目跟蹤,成都創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務
靜態(tài)代理的問題: 當我們有非常多實現(xiàn)了不同接口的類需要被代理的時候,靜態(tài)代理的方式就顯得非常麻煩。我們需要給每個被代理類實現(xiàn)相同的代理邏輯,但代碼大多數都是重復的,我們可以使用反射進行動態(tài)代理來解決這一問題。
動態(tài)代理Java實現(xiàn)
我們需要實現(xiàn)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;
}
}
實現(xiàn)完成后,將這個實現(xiàn),以及被代理類的類加載器、被代理類的接口一同傳入Proxy
類的靜態(tài)方法newProxyinstance
中,就可以動態(tài)的創(chuàng)建代理類了。
public static Object newProxyInstance(ClassLoader loader, Class>[] interfaces, InvocationHandler h)
簡單來說,就是定義一個適配器接口,并繼承需要被適配的類,然后實現(xiàn)適配器接口的相應方法。在實現(xiàn)接口的方法時,我們只需要實現(xiàn)那些需要被改造的舊接口,對于符合要求的舊接口,可以繼續(xù)沿用父類方法。(因此,如果需要適配的對象接口很多,并且和新接口定義大部分都相同,那么可以直接使用基于類的實現(xiàn))
基于實現(xiàn)的方法,是將被適配的類注入進來,再進行相應改造的方式。相較基于類的方式,更靈活。如果新舊接口存在較多的不一致,推薦使用基于實現(xiàn)的方式,會更加靈活。
比如slf4j就是一套統(tǒng)一不同底層日志包的接口。此外,考慮到不同日志包的api存在的不同,slf4j還提供了相應的適配器,來統(tǒng)一api管理。