浅谈模式 - 装饰者模式

对象包装对象,目的是功能增强。

最常见的JAVA IO

DubboSpring中都有一些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

DubboHandler机制包装非常复杂,可以详细看下。下面给出一张图,供参考。具体的包装过程看文章 dubbo的handler机制

image

查看全部 浅谈模式 - 汇总篇

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。