对象包装对象,目的是功能增强。
最常见的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机制
查看全部 浅谈模式 - 汇总篇