對象包裝對象,目的是功能增強。
最常見的JAVA IO
。
Dubbo
,Spring
中都有一些wapper
類。
// 出自Dubbo源碼 ProtocolFilterWrapper,版本2.6.4
public class ProtocolFilterWrapper implements Protocol {
private final Protocol protocol;// 被包裝的protocol對象
public ProtocolFilterWrapper(Protocol protocol) {
if (protocol == null) {
throw new IllegalArgumentException("protocol == null");
}
this.protocol = protocol;
}
private static <T> Invoker<T> buildInvokerChain(final Invoker<T> invoker, String key, String group) {
// -----------------省略一些代碼-------------------
}
@Override
public int getDefaultPort() {
return protocol.getDefaultPort();
}
@Override
public <T> Exporter<T> export(Invoker<T> invoker) throws RpcException {
if (Constants.REGISTRY_PROTOCOL.equals(invoker.getUrl().getProtocol())) {
return protocol.export(invoker);
}
return protocol.export(buildInvokerChain(invoker, Constants.SERVICE_FILTER_KEY, Constants.PROVIDER));
}
@Override
public <T> Invoker<T> refer(Class<T> type, URL url) throws RpcException {
if (Constants.REGISTRY_PROTOCOL.equals(url.getProtocol())) {
return protocol.refer(type, url);
}
return buildInvokerChain(protocol.refer(type, url), Constants.REFERENCE_FILTER_KEY, Constants.CONSUMER);
}
@Override
public void destroy() {
protocol.destroy();
}
}
上述代碼在Dubbo
中的具體原理參考文章 dubbo的filter
Dubbo
的Handler
機制包裝非常復雜,可以詳細看下。下面給出一張圖,供參考。具體的包裝過程看文章 dubbo的handler機制
image
查看全部 淺談模式 - 匯總篇